Visual C#套接字编程
- 与套接字相关的类的简介
- 什么是套接字
- Socket类以及其常用属性
- Socket类常用方法
- 套接字编程示例
与套接字相关的类的简介
什么是套接字
应用层通过传输层进行数据通信时,会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。
区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意是 “插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
套接字的使用分为两种模式:阻塞模式和非阻塞模式。阻塞模式也称为同步模式,在这种模式下,Socket操作直到全部操作完成后才返回。比如要接收数据包时,必须等到对方将数据包发送过来为止,调用Socket函数的线程在这期间是被挂起的,所以程序看起来好像是停止响应了。显然,要以这种方式执行Socket函数的话,几乎每个函数的使用都会引起程序“停止响应”的假象,所以必须考虑在不同的线程中执行每个Socket函数,这显然是比较麻烦的。
在BSD UNIX中,套接字是以阻塞模式执行的,这对以命令行方式执行的UNIX程序来说并不是问题,但阻塞模式不是很适合于Windows下的消息驱动体系,所以WinSock为所有的函数提供了非阻塞模式的版本,非阻塞模式又称异步模式,在这种模式下,一个函数执行后会立即返回,即使是操作还没有全部完成,但是当函数最终完成操作的时候,Socket接口会通过某种形式(如窗口消息)通知应用程序,显然这种方式非常适合于Windows下的消息驱动体系。一般来说,Socket接口强烈推荐程序员使用非阻塞模式进行通信编程,仅在绝对有必要的情况下才采用阻塞方式进行通信编程,因为非阻塞模式的操作能够更好地在Windows环境下进行。
Socket类以及其常用属性
Socket类为网络通信提供了一套丰富的方法和属性。所要求的命名空间为System.Net.Sockets。其常用属性如下表:
AddressFamily
受 .NET Framework 精简版的支持。 |
获取 Socket 的地址族。 |
Available
受 .NET Framework 精简版的支持。 |
获取已经从网络接收且可供读取的数据量。 |
Blocking
受 .NET Framework 精简版的支持。 |
获取或设置一个值,该值指示 Socket 是否处于阻塞模式。 |
Connected
受 .NET Framework 精简版的支持。 |
获取一个值,该值指示 Socket 是否已连接到远程主机。 |
Handle
受 .NET Framework 精简版的支持。 |
获取 Socket 的操作系统句柄。 |
LocalEndPoint
受 .NET Framework 精简版的支持。 |
获取本地终结点。 |
ProtocolType
受 .NET Framework 精简版的支持。 |
获取 Socket 的协议类型。 |
RemoteEndPoint
受 .NET Framework 精简版的支持。 |
获取远程终结点。 |
SocketType
受 .NET Framework 精简版的支持。 |
获取 Socket 的类型。 |
SupportsIPv4
|
获取一个值,该值指示当前主机上是否拥有并已启用 IPv4 支持功能。如果当前主机支持 IPv4 协议,则为 true;如果不支持,则为 false。 |
SupportsIPv6
|
获取一个值,该值指示当前主机上是否拥有并已启用 IPv6 支持功能。如果当前主机支持 IPv6 协议,则为 true;如果不支持,则为 false。 |
Socket类常用方法
公共构造函数
注意:
addressFamily 参数指定 Socket 使用的地址家族,socketType 参数指定 Socket 的类型,protocolType 参数指定 Socket 使用的协议。这三个参数不是独立的。有些地址族会限制哪些协议可与其一起使用,同时 Socket 类型在协议中通常是隐式的。如果地址族、Socket 类型和协议类型的组合导致无效的 Socket,则此构造函数将引发 SocketException。 对于我们来讲,最常用的组合有:
- Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
- Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp );
公共方法
posted on 2006-11-06 16:46
阿土仔的世界 阅读(1362)
评论(1) 编辑 收藏 引用 网摘 所属分类:
网络编程