一.简介Socket:
Socket诞生于上个世纪80年代初,美国政府的高级研究工程机构(ARPA)给加利福尼亚大学伯克力(Berkeley)分校提供了资金,委托他们在UNIX操作系统下实现TCP/IP协议的开发接口。于是研发人员就为TCP/IP网络通信开发了一个API(应用程序接口)。这个API称为Socket接口(套接字)。所以有时候说,Socket是TCP/IP上的API。
到了上个世纪90年代,当时的一些网络开发商,包括现在地Sun和Microsoft公司等,共同制定了一套WINDOWS下的网络编程接口,即WindowsSockets规范,简称WinSock规范。WinSock规范是一套开放的、支持多种协议的Windows下的网络编程接口。从1991年的1.0版到1995年的2.0.8版,经过不断完善并在Intel、Microsoft、Sun等公司的大力支持下,已成为Windows网络编程的事实上的标准。目前,WinSock规范主要有1.1版和2.0版。两者的最重要区别是1.1版只支持TCP/IP协议,而2.0版可以支持多协议。2.0版有良好的向后兼容性,任何使用1.1版的源代码,二进制文件,应用程序都可以不加修改地在2.0规范下使用。
可见Socket接口其实是TCP/IP网络的API接口函数,Socket数据传输其实就是一种特殊的I/O。常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
二.Visual C#中操作Socket:
虽然Visual C#可以使用NetworkStream来传送、接收数据,但NetworkStream在使用中有很大的局限性,利用NetworkStream只能传送和接收字符类型的数据,如果要传送的是一些复杂的数据如:二进制数据等,它就显得能力有限了。但使用NetworkStream在处理自身可操作数据时,的确要比Socket方便许多。Socket(套接字)几乎可以处理任何在网络中需要传输的数据类型。
我们知道Visual C#和Visual C++的区别之一,就是Visual C#没有属于自己的类库,而Visual C++却是有的,Visual C#使用的类库是.Net框架为所有开发.Net平台程序语言提供的一个公用的类库——.Net FrameWork SDK。Visual C#主要网络功能主要使用.Net FrameWork SDK中的提供的二个命名空间“System.Net.Sockets”和“System.Net”。而实现Socket使用的是命名空间“System.Net.Sockets”中的Socket类。Visual C#通过创建Socket类的实例来实现Socket的托管版本。在Visual C#中创建完Socket实例后,可以通过此Socket实例的Bind方法绑定到网络中指定的终结点,也可以通过其Connect方法向指定的终结点建立的连接。连接创建完毕,就可以使用其Send或SendTo方法将数据发送到Socket;同样使用其的Receive或ReceiveFrom方法从Socket中读取数据。在Socket使用完毕后,请使用其的Shutdown方法禁用Socket,并使用Close方法关闭Socket。表01和表02是Socket类中的常用属性和方法及其简要说明。
| 属性 | 说明 |
| AddressFamily | 获取Socket的地址族。 |
| Available | 获取已经从网络接收且可供读取的数据量。 |
| Blocking | 获取或设置一个值,该值指示Socket是否处于阻塞模式。 |
| Connected | 获取一个值,该值指示Socket是否已连接到远程资源。 |
| Handle | 获取Socket的操作系统句柄。 |
| LocalEndPoint | 获取本地终结点。 |
| ProtocolType | 获取Socket的协议类型。 |
| RemoteEndPoint | 获取远程终结点。 |
| SocketType | 获取Socket的类型。 |
| 方法 | 说明 |
| Accept | 创建新的Socket以处理传入的连接请求。 |
| BeginAccept | 开始一个异步请求,以创建新的Socket来接受传入的连接请求。 |
| BeginConnect | 开始对网络设备连接的异步请求。 |
| BeginReceive | 开始从连接的Socket中异步接收数据。 |
| BeginReceiveFrom | 开始从指定网络设备中异步接收数据。 |
| BeginSend | 将数据异步发送到连接的 |
| BeginSendTo | 向特定远程主机异步发送数据。 |
| Bind | 使Socket与一个本地终结点相关联。 |
| Close | 强制Socket连接关闭。 |
| Connect | 建立到远程设备的连接。 |
| EndAccept | 结束异步请求以创建新的Socket来接受传入的连接请求 |
| EndConnect | 结束挂起的异步连接请求。 |
| EndReceive | 结束挂起的异步读取。 |
| EndReceiveFrom | 结束挂起的、从特定终结点进行异步读取。 |
| EndSend | 结束挂起的异步发送 |
| EndSendTo | 结束挂起的、向指定位置进行的异步发送。 |
| GetSocketOption | 返回Socket选项的值。 |
| IOControl | 为Socket设置低级别操作模式 |
| Listen | 将Socket置于侦听状态。 |
| Poll | |
| Receive | 接收来自连接Socket的数据。 |
| ReceiveFrom | 接收数据文报并存储源终结点。 |
| Select | 确定一个或多个套接字的状态。 |
| Send | 将数据发送到连接的 |
| SendTo | 将数据发送到特定终结点。 |
| SetSocketOption | 设置Socket选项。 |
| Shutdown | 禁用某Socket上的发送和接收。 |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-629683/ ,如需转载,请注明出处,否则将追究法律责任。