C# 网络编程之套接字编程基础知识

      最近阅读了周存杰编写的《C#网络编程实例教程》并阅读了不少相关方面的资料,同时本身也作了一些套接字编程方面的C#程序,因此根据它的知识总结了最近的套接字编程的一些知识点,方便本身的理解与他人的学习,同时也有一些本身之前学习的计算机网络、操做系统等相关知识。html

一.   套接字编程的概念编程

      套接字(Winsock)是一种独立于协议的网络编程接口,在OSI中集中在会话层和传输层。(补充知识)简单回归网络知识,计算机网络中的”五层协议的体系结构”和”OSI体系结构”以下图所示:数组

      其中它们每层实现的功能,构成的网络通讯简单的示意图以下图所示:(“网际层”对应”网络层”,”网络接口层”对应底层的”数据链路层+物理层”)缓存

      TCP/IP协议的第一个BSD UNIX提供了一个访问通讯协议的调用——Socker。Socket类提供了对套接字的支持,提供了一整套属性和方法实现对端口的绑定、监听、链接、数据传输,其中套接字编程接口使用的命名空间为System.Net.Sockets服务器

      (补充知识).Net网络中经常使用的类以下所示:
      Socket:实现构造一个新的套接字接口对象
      Dns:提供简单的域名解析功能
      IPAddress:提供网际协议(IP)地址的支持,其方法含定义获取主机的IP地址
      IPEndPoint:将网络端点表示为IP地址和端口号
      IPHostEntry:为网络主机地址信息提供容器类,构造一个主机对象
      NetworkStream:提供用于网络访问的基础数据流
      TcpLinster:从TCP网络客户端监听链接
      TcpClient:为TCP网络服务提供客户端链接
      UdpClient:提供用户数据报(UDP)网络服务
网络

二.Socket类属性异步

      Socket类常见属性以下所示:
      AddressFamily:定义套接字地址家族,常见的为InterNetwork
      Available:获取从网络已接受到的且能够读取的数据量的大小,存放网络缓冲区中还未处理的数据的大小
      Blocking:决定是不是套接字工做在阻塞模式,默认为False
      Connected:获取套接字是否链接成功的信息,True为链接成功,False为链接失败
      Handle:获取操做系统句柄
      LocalEndPoint:获取本地终端的信息
      ProtocolType:定义套接字使用的协议的类型,常见的为Tcp
      RemoteEndPoint:远程终端信息
      SocketType:定义套接字类型,数据流或数据包
socket

      (补充知识)在网络编程中常使用的两种方法,socket类亦支持该两种基本模式——同步和异步。
      同步:对执行网络操做的函数的调用一只等到操做完成后才将控制返回给调用程序;
      异步:网络操做的函数调用当即返回。
      同步方法调用在程序继续执行以前须要等待同步方法执行完毕返回结果,异步方法则在被调用以后当即返回以便程序在被调用方法完成其任务的同时执行其它操做。
由于同步方法调用会致使程序流程中途等待,因此采用同步方法的状况下每每会致使程序执行的延迟,相比来讲。在某些条件下选择异步方法调用就可能更好一些。
async

      举个例子:(引用别人的例子http://zhidao.baidu.com/question/97924815.html
      Socket传输中拿TCP传输为例。假设服务器A客户机B进行通讯传输。
      首先须要在A机创建监听线程。监听某一端口,那么B机能够向A机发送通信请求,B机链接到A机之后。A机能够从他的监听队列中取的一个监听对象。在A端拿到了这个Socket对象就能够进行接收跟发送数据了。这里问题就出现了。假如B端在请求A端的时候请求成功就发送一条数据。那么 A端就能够直接拿Socket对象获得他的信息。可是假如B端并无在链接成功后直接发送信息而是在后来不肯定的时间这内发送的信息。那么A端就没法获得这条信息。一般的作法是用一个定时器去不短的扫描这个数据缓存区。看是否是有数据存在这样效率很是低下。那么如何解决这个问题呢。
      就用到了咱们的异步传输。异步传输的原理是:在A端获得这个SOCKET对象之后并非直接去接收数据而是创建一个回调函数。回调函数是由系统维护的。他在指定的时间自动去扫描数据存储区。假若有数据他就把数据存储到指定的字节数组中,不用用户本身去关心。
函数

三.Socket编程经常使用方法

这里主要介绍几种经常使用的套接字编程方法:

1.构造方法
构造一个新的套接字对象,该方法调用时前面须添加new,返回值为套接字对象实例.
public Socket(
    AddressFamilyaddressFamily, //网络类型
    SocketTypesocketType,           //套接字类型
    ProtocolTypeprotocolType);     //使用的协议
)

2.Bind()方法
绑定特殊端口用于监听
public void Bind(EndPoint loadEP) //本地主机,如IPEndPoint对象

3.Listen()方法
该方法用于监听端口
public void Listen(int bcaklog)  //最大可处理的链接数

4.Accept()方法
该方法用于决定套接字的状态,用于新建一个套接字处理新建的链接
public Socket Accept()    //返回值为新的套接字对象实例

5.BeginAccpet()和EndAccept()方法
该方法用于异步处理链接请求,与Accept()方法区别是Accept()当即处理链接请求,它是异步处理.
public IAsyncResult BeginAccept(
AsyncCallBack callback,  //异步回调
objecet state  //自定义对象
)
EndAccpet()用于结束一个处理异步链接请求和BeginAccept()方法配合使用.
public socket EndAccept(IAsynResult asyncResult)  //为处理的套接字请求,即BeginAccept()方法的请求.

      因为做者还在学习当中,还有不少方法,下面只提供方法名,具体的方法参数本身再去查找.包括Connect()、BeginConnect()\EndConnect()、Close()、send()、BeginSend()\EndSend()、SendTo()、BeginSendTo()\EndSendTo()、Receive()、BeginReceive()\EndReceive()、ReceiveFrom()、GetSocketOption()等方法.

四.总结

      上面的叙述就是我最近学习的C#网络编程关于套接字的一些基础知识的理解,其中主要的内容是根据阅读的书。同时参考了一些网上资料及本身学过的网络知识和操做系统知识,这篇总结对我之后的网络编程的学习颇有帮组,但愿也能帮组你们。同时若是有错误或不足之处,但愿你们原谅!最后感谢我看的周存杰同志编写《C#网络编程实例教程》书籍。

    (BY:Eastmount 2013-7-13-夜10点http://blog.csdn.net/eastmount/