随笔-6  评论-19  文章-0  trackbacks-0

Visual C#套接字编程

  1. 与套接字相关的类的简介
    1. 什么是套接字
    2. Socket类以及其常用属性
    3. Socket类常用方法
  2. 套接字编程示例

与套接字相关的类的简介

什么是套接字

应用层通过传输层进行数据通信时,会遇到同时为多个应用程序进程提供并发服务的问题。多个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环境下进行。

2.1.1.gif

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 的类型。
公共属性 static (Shared in Visual Basic) SupportsIPv4 获取一个值,该值指示当前主机上是否拥有并已启用 IPv4 支持功能。如果当前主机支持 IPv4 协议,则为 true;如果不支持,则为 false。
公共属性 static (Shared in Visual Basic) SupportsIPv6 获取一个值,该值指示当前主机上是否拥有并已启用 IPv6 支持功能。如果当前主机支持 IPv6 协议,则为 true;如果不支持,则为 false。

Socket类常用方法

公共构造函数

公共构造函数 Socket 构造函数
受 .NET Framework 精简版的支持。
初始化 Socket 类的新实例。


注意: addressFamily 参数指定 Socket 使用的地址家族,socketType 参数指定 Socket 的类型,protocolType 参数指定 Socket 使用的协议。这三个参数不是独立的。有些地址族会限制哪些协议可与其一起使用,同时 Socket 类型在协议中通常是隐式的。如果地址族、Socket 类型和协议类型的组合导致无效的 Socket,则此构造函数将引发 SocketException。 对于我们来讲,最常用的组合有:

  • Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
    //定义了一个以TCP协议为通信协议的套接字
  • Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp );
    //定义了一个以UDP协议为通信协议的套接字

公共方法

公共方法Accept
受 .NET Framework 精简版的支持。
为新建连接创建新的 SocketAccept同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回新的Socket。在阻塞模式中,Accept 将会持续处于阻塞状态,直到传入的连接尝试进入队列。
注意在调用 Accept 方法之前,必须首先调用 Listen 方法来侦听传入的连接请求,并将侦听到的请求放入队列中。
公共方法 BeginAccept
受 .NET Framework 精简版的支持。

开始一个异步操作来接受一个传入的连接尝试。面向连接的协议可以使用 BeginAccept 方法来异步处理传入的连接尝试。

必须创建实现 AsyncCallback 委托的回调方法,并将其名称传递给 BeginAccept 方法。要实现这一点,至少必须通过 state 参数把侦听 Socket 传递给 BeginAccept。

公共方法 BeginConnect
受 .NET Framework 精简版的支持。
开始一个对远程主机连接的异步请求。
公共方法 BeginReceive
受 .NET Framework 精简版的支持。
开始从连接的 Socket 中异步接收数据。
公共方法 BeginReceiveFrom
受 .NET Framework 精简版的支持。
开始从指定网络设备中异步接收数据。
公共方法 BeginSend
受 .NET Framework 精简版的支持。
将数据异步发送到连接的 Socket
公共方法 BeginSendTo
受 .NET Framework 精简版的支持。
向特定远程主机异步发送数据。
公共方法 Bind
受 .NET Framework 精简版的支持。
使 Socket 与一个本地终结点相关联。
公共方法 Close
受 .NET Framework 精简版的支持。
关闭 Socket 连接并释放所有关联的资源。
公共方法 Connect
受 .NET Framework 精简版的支持。
建立与远程主机的连接。
公共方法 EndAccept
受 .NET Framework 精简版的支持。
异步接受传入的连接尝试,并创建新的 Socket 来处理远程主机通信。
公共方法 EndConnect
受 .NET Framework 精简版的支持。
结束挂起的异步连接请求。
公共方法 EndReceive
受 .NET Framework 精简版的支持。
结束挂起的异步读取。
公共方法 EndReceiveFrom
受 .NET Framework 精简版的支持。
结束挂起的、从特定终结点进行异步读取。
公共方法 EndSend
受 .NET Framework 精简版的支持。
结束挂起的异步发送。
公共方法 EndSendTo
受 .NET Framework 精简版的支持。
结束挂起的、向指定位置进行的异步发送。
公共方法 Equals(从 Object 继承)
受 .NET Framework 精简版的支持。
已重载。确定两个 Object 实例是否相等。
公共方法 GetHashCode
受 .NET Framework 精简版的支持。
已重写。参见 Object.GetHashCode
公共方法 GetSocketOption
受 .NET Framework 精简版的支持。
已重载。返回 Socket 选项的值。
公共方法 GetType(从 Object 继承)
受 .NET Framework 精简版的支持。
获取当前实例的 Type
公共方法 IOControl
受 .NET Framework 精简版的支持。
Socket 设置低级别操作模式。
公共方法 Listen
受 .NET Framework 精简版的支持。
Socket 置于侦听状态。
公共方法 Poll
受 .NET Framework 精简版的支持。
确定 Socket 的状态。
公共方法 Receive
受 .NET Framework 精简版的支持。
已重载。接收来自绑定的 Socket 的数据。
公共方法 ReceiveFrom
受 .NET Framework 精简版的支持。
已重载。接收数据文报并存储源终结点。
公共方法 static (Shared in Visual Basic) Select
受 .NET Framework 精简版的支持。
确定一个或多个套接字的状态。
公共方法 Send
受 .NET Framework 精简版的支持。
已重载。将数据发送到连接的 Socket
公共方法 SendTo
受 .NET Framework 精简版的支持。
已重载。将数据发送到特定终结点。
公共方法 SetSocketOption
受 .NET Framework 精简版的支持。
已重载。设置 Socket 选项。
公共方法 Shutdown
受 .NET Framework 精简版的支持。
禁用某 Socket 上的发送和接收。
公共方法 ToString(从 Object 继承)
受 .NET Framework 精简版的支持。
返回表示当前 ObjectString
posted on 2006-11-06 16:46 阿土仔的世界 阅读(1362) 评论(1)  编辑 收藏 引用 网摘 所属分类: 网络编程

评论:
# re: [课件]第二章:Visual C#套接字编程 2007-07-29 11:55 | 翡翠
楼主真细心呀
http://www.hoopower.com  回复  更多评论
  

只有注册用户登录后才能发表评论。