[转]Socket

         System.Net.Sockets命名空间包含一些可以给低级的Winsock API提供实际.NET接口类.
         (1)套接字的结构:
         System.Net.Sockets命名空间的核心是Socket(套接字)类。它提供了Winsock API的C#管理代码的实现。Socket类的构造函数如下:
         Socket(AddressFamily  af,  SocketType  st,  ProtocolType  pt)
         它用三个参数定义创建的套接字类型:
              用AdressFamily定义网络的类型
              用SocketType定义数据连接的类型
              用ProtocolType指定具体的网络协议
         这些参数的每一个都可以用System.Net.Sockets命名空间中一个单独的枚举来表现。每个枚举都包含可以使用的值。对网络上的IP通信,AddressFamily应当总是用AdressFamily.
InterNetwork值。使用InterNetwork AdressFamily,SocketType参数必须与特定的ProtocolType参数相匹配。不允许用户把SocketTypes和protocolTypes混淆匹配。
         (2)使用面向连接的套接字:
          .NET框架中,用户可以跨过网络与远程主机建立面向连接的通信。由于C#是一个面向对象的语言,所以套接字作为Socket类的方法实现。借助于从Socket实例对方法的引用,用户可以用显示的套接字执行网络操作。
          服务器函数:
          在服务器套接字建立之后,必须把它绑定到系统中的一个本地网络地址。Bind()方法就用于完成这一功能:
           Bind(EndPoint  adress)
           address参数必须指向一个有效的IPEndPoint实例,该实例包含一个本地IP地址和一个端口号。在套接字绑定到本地地址之后,就用Listen方法等待客户机发出的连接尝试:
           Listen(int backlog)
           backlog参数指出系统等待用户程序服务排队的连接数。超过等待连接数的任何客户的尝试都会被拒绝。用户应当记住,在这里指定一个大的编号可能会造成 用户的服务器程序被执行的结果。每个待解决的连接尝试都暂存在TCP缓冲器区中缓存器空间,这意味着只有较少的缓冲器空间用于发送和接收包。
            在Listen方法执行过之后,服务器已经做好了接收任何引进连接的准备。这是用Accept方法完成的,该方法返回一个新的套接字描述符,这个连接所有的通信调用都可以使用该描述符。
            客户机函数
            客户机设备也必须把一个地址绑定到创建的Socket对象,使用Connect方法,像Bind函数一样,Connect也要求一个客户机需要连接的远程设备的IPEndPoint对象。
            一旦连接已经建立,客户机就可以像服务器使用的方法一样,使用Socket类的Send和Receive方法。当通信完成之后,必须把Socket实例关闭。
            (3)使用无连接的套接字
             当用户使用Socketype.Dgram套接字类型创建套接字的时候,用UDP协议在网络上传输包。用户必须为服务器设置Bind方法,在特定的端口建立套接字。服务器与客户机不需要使用Listen和Connect方法。
             由于没有为通信而建立连接,所以标准的Receive和Send方法不起作用。用户必须用特殊的ReceiveFrom和SentTo方法。
             (4)无阻塞编程技术
              .NET Socket类的I/O方法在默认情况下使用阻塞的方法。当一个程序到达被阻碍的网络函数时,程序需要在那里等待,知道函数完成后才能继续。有三个可以避免使用阻塞网络调用的C#技术:无阻塞套接字,多路传输套接字和一部套接字。
                 无阻塞套接字:
                  C# Socket对象包含有多个可以查询它们值的属性。不过,其中有一个Blocking属性也可以被设置。用户可以把一个套接字的Blocking属性设置 成假(false),使的套接字编程无阻塞模式。当套接字是无阻塞模式的时候,它就会不等待一个I/O方法的完成。它将会检查这个方法,如果它不能完成, 这个方法会失败,而程序会继续进行。
                 多路传输套接字
                   Socket类提供了Select方法。这个方法用于多路传输多个套接字实例,以便找到一个已经准备读或写的套接字。
                 异步套机子编程技术
                 .NET框架使用有Windows Winsock API推出的异步套接字模式。这种方法在套接字准备接收或发送数据的时候,允许用户使用单独的方法。用户不是用Receive方法等待来自客户机的数据, 而是使用BeginReceive方法,这种方法会注册一个当套接字上的数据可用时可以被调用的代表(委托delegate)。在代表方法中,用户必须用 EndReceive方法阻止从套接字异步读和检索数据。
原文地址:https://www.cnblogs.com/lauer0246/p/1383034.html