C# Socket 编程

EndPoint 类

标识网络地址。这是一个 abstract 类。

命名空间:  System.Net
程序集:  System(在 System.dll 中)

[SerializableAttribute]
public abstract class EndPoint

备注

EndPoint 类提供了一个表示网络资源或服务的 abstract 基类。子类组合网络连接信息以构成服务的连接点。

继承层次结构

System.Object
System.Net.EndPoint
System.Net.IPEndPoint

Socket.Bind 方法

使 Socket与一个本地终结点相关联。

命名空间:  System.Net.Sockets
程序集:  System(在 System.dll 中)

public void Bind(EndPoint localEP )
参数
localEP
类型:System.Net.EndPoint

要与 Socket关联的本地 EndPoint

异常
ArgumentNullException

localEP 为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing)。

SocketException

试图访问套接字时发生错误。有关更多信息,请参见备注部分。

ObjectDisposedException

Socket已关闭。

SecurityException

调用堆栈上部的调用方无权执行所请求的操作。

备注

如果需要使用特定的本地终结点,请使用 Bind 方法。必须先调用 Bind,然后才能调用 Listen方法。除非需要使用特定的本地终结点,否则不必在使用 Connect方法之前调用 Bind。对无连接和面向连接的协议都可以使用 Bind 方法。

在调用 Bind 之前,必须首先创建打算从其进行数据通信的本地 IPEndPoint。如果您不介意分配哪个本地地址,则可以用 IPAddress.Any作为地址参数创建一个 IPEndPoint,这样,基础服务提供程序将会分配最适合的网络地址。如果您有多个网络接口,这将有助于简化您的应用程序。如果您不介意使用哪个本地端口,则可以创建一个使用 0 作为端口号的 IPEndPoint。在这种情况下,服务提供程序将会分配一个可用的端口号(介于 1024 和 5000 之间)。

如果使用上面的方法,您可以通过调用 LocalEndPoint获知所分配的本地网络地址和端口号。如果当前使用的是面向连接的协议,则直到您调用了 Connect或 EndConnect方法后,LocalEndPoint才会返回本地分配的网络地址。如果当前使用的是无连接协议,则直到完成一个发送或接收操作后,才可访问该信息。

注意:

如果打算接收多路广播的数据报,则必须使用多路广播端口号调用 Bind 方法。

注意:

如果打算通过使用 ReceiveFrom方法来接收无连接的数据报,则必须调用 Bind 方法。

注意:

如果在调用 Bind 方法时接收到 SocketException,则可以使用 SocketException.ErrorCode属性获取特定的错误代码。获取此代码后,您可以参考 MSDN Library 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关该错误的详细说明。

注意:

当在应用程序中启用网络跟踪功能后,此成员将输出跟踪信息。有关更多信息,请参见 网络跟踪。

Socket.Listen 方法

将 Socket置于侦听状态。

命名空间:  System.Net.Sockets
程序集:  System(在 System.dll 中)

public void Listen(
int backlog
)

参数
backlog
类型:System.Int32

挂起连接队列的最大长度。

异常
SocketException

试图访问套接字时发生错误。有关更多信息,请参见备注部分。

ObjectDisposedException

Socket已关闭。

备注

Listen 可以让一个面向连接的 Socket侦听传入的连接尝试。backlog 参数指定队列中最多可容纳的等待接受的传入连接数。若要确定可指定的最大连接数,请检索 MaxConnections值。Listen 不会阻止。

如果收到 SocketException,请使用 ErrorCode属性获取特定的错误代码。获取此代码后,您可以参考 MSDN Library 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关该错误的详细说明。可使用 AcceptBeginAccept来接受来自队列的连接。

注意:

在调用 Listen 之前,必须首先调用 Bind方法,否则 Listen 将引发 SocketException

注意:

当在应用程序中启用网络跟踪功能后,此成员将输出跟踪信息。有关更多信息,请参见 网络跟踪。

注意:

根据操作系统的不同,backlog 参数被限制为不同的值。您可以指定更大的值,但 backlog 将受操作系统的限制。

Socket.BeginAccept 方法

开始一个异步操作来接受一个传入的连接尝试。

重载列表

BeginAccept(AsyncCallback, Object)
开始一个异步操作来接受一个传入的连接尝试。

BeginAccept(Int32, AsyncCallback, Object)
开始异步操作以接受传入的连接尝试并接收客户端应用程序发送的第一个数据块。

BeginAccept(Socket, Int32, AsyncCallback, Object)
开始异步操作以接受从指定套接字传入的连接尝试并接收客户端应用程序发送的第一个数据块。

命名空间:  System.Net.Sockets
程序集:  System(在 System.dll 中)

语法

[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)] public IAsyncResult BeginAccept( AsyncCallback callback, Object state )
参数
callback
类型:System.AsyncCallback

AsyncCallback 委托。

state
类型:System.Object

一个对象,它包含此请求的状态信息。

返回值

类型:System.IAsyncResult

一个 IAsyncResult,它引用异步 Socket创建。

异常

ObjectDisposedException

Socket对象已关闭。

NotSupportedException

此方法需要 Windows NT。

InvalidOperationException

正在接受的套接字不会侦听连接。在调用 BeginAccept之前必须调用 Bind和 Listen

- 或 -

已接受的套接字是绑定的。

ArgumentOutOfRangeException

receiveSize 小于 0。

SocketException

试图访问套接字时发生错误。有关更多信息,请参见备注部分。

备注

注意:

应用到此 的 HostProtectionAttribute 属性 (attribute) 具有以下 Resources 属性 (property) 值:ExternalThreading。HostProtectionAttribute 不影响桌面应用程序(这些应用程序通常通过双击图标、键入命令或在浏览器中输入 URL 来启动)。有关更多信息,请参见 HostProtectionAttribute 类或 SQL Server 编程和宿主保护属性。

面向连接的协议可以使用 BeginAccept方法来异步处理传入的连接尝试。以异步方式接受连接将使您能够在单独的执行线程中发送和接收数据。在调用 BeginAccept方法之前,必须调用 Listen方法来侦听传入的连接请求,并将侦听到的请求放入队列中。

必须创建实现 AsyncCallback 委托的回调方法,并将其名称传递给 BeginAccept方法。若要实现这一点,至少必须通过 state 参数将实施侦听的 Socket对象传递给 BeginAccept。如果您的回调需要更多信息,则可以创建一个小型类来保存 Socket和其他必需的信息。通过 state 参数将此类的一个实例传递给 BeginAccept方法。

回调方法应调用 EndAccept方法。应用程序调用 BeginAccept时,系统会使用单独的线程执行指定的回调方法,并在 EndAccept上一直处于阻止状态,直到检索到挂起的连接。EndAccept将会返回新的 Socket对象,供您用来向远程主机发送数据和从远程主机接收数据。不能使用返回的这个 Socket接受连接队列中的任何附加连接。如果想要在调用 BeginAccept方法后使原始线程阻止,请使用 WaitHandle..::.WaitOne。当需要原始线程继续执行时,请在回调方法中调用 ManualResetEvent 的 Set 方法。有关编写回调方法的其他信息,请参见 Callback 示例。

注意:

可以调用返回的 Socket的 RemoteEndPoint方法来标识远程主机的网络地址和端口号。

注意:

如果收到 SocketException,请使用 SocketException..::.ErrorCode属性获取特定的错误代码。获取此代码后,可以参考 MSDN 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关此错误的详细说明。

注意:

当在应用程序中启用网络跟踪功能后,此成员将输出跟踪信息。有关更多信息,请参见 网络跟踪。

注意:

执行上下文(安全上下文、模拟用户及调用上下文)会被缓存,以用于 Socket异步方法。在首次使用一个特定上下文(特定 Socket异步方法、特定 Socket实例及特定回调)后,该上下文的后续使用将得到性能改

Socket.EnableBroadcast 属性

获取或设置一个 Boolean 值,该值指定 Socket是否可以发送或接收广播数据包。

命名空间:  System.Net.Sockets
程序集:  System(在 System.dll 中)

语法

public bool EnableBroadcast { get; set; }
属性值

类型:System.Boolean

如果 Socket允许广播数据包,则为 true;否则为 false。默认为 false。

异常

SocketException

此选项仅对数据报套接字有效。

ObjectDisposedException

Socket已关闭。

备注

广播仅限于特定子网,并且必须使用用户数据报协议 (UDP)。对于 Internet 协议版本 4,可通过向 255.255.255.255 发送数据包来向本地子网广播;也可以使用定向广播地址,即 Internet 协议 (IP) 地址的网络部分,同时所有位都在主机部分设置。例如,如果 IP 地址是 192.168.1.40(C 类地址,网络掩码为 255.255.255.0,网络部分是前三个八进制数,主机部分是最后一个八进制数),则您的定向广播地址是 192.168.1.255。

对传输控制协议 (TCP) 套接字设置此属性不起任何作用。

原文地址:https://www.cnblogs.com/IT-haidong/p/4660683.html