3

阅读此异步套接字示例时,我发现以下代码:

    // Get the socket that handles the client request.
    Socket listener = (Socket) ar.AsyncState;
    Socket handler = listener.EndAccept(ar);

我很难找到关于这两个套接字之间区别的文档,我还想知道关闭处理程序或关闭处理程序将如何影响原始套接字。谁能解释一下,或者给我一些文档?

4

3 回答 3

2

套接字是特定机器上的唯一连接,即127.0.0.1:1024. 一次只能建立一个活动连接。“侦听器”侦听固定端口(例如,在我上面的示例中为 1024)。它的工作是成为接受连接的“公共”方式。一旦它接受一个连接,它就会在一个新的、随机的(好吧,相当伪随机的)选择端口上创建一个新的套接字。然后原始连接应用程序和主机可以通过该套接字进行通信,从而释放侦听套接字以获取另一个连接(这将为新连接分配另一个端口号,等等)。

EndAccept一旦建立连接,通常就是您需要做的所有事情。通常listener会继续侦听更多连接以接受。如果没有,您通常只需处置或关闭套接字以停止侦听并取消任何待处理的接受。handler用于执行应用程序所需的任何通信,完全独立于套接字listener。当您使用完handler套接字后,您将处理或关闭它,并且因为它listener是独立的,它会继续“运行”。

Shutdown将刷新面向连接的套接字上的任何未决数据(在之前调用Close)并且不会影响任何其他套接字。

于 2012-08-18T04:08:17.187 回答
1

侦听器是正在侦听连接的套接字。您不想让侦听器被占用,否则多个客户端将无法通过该套接字进行连接。在该套接字上调用 EndAccept 会为您提供一个套接字,供服务器与客户端通信,并打开侦听器以获取更多连接。

关闭处理程序不应影响侦听器套接字。

于 2012-08-17T22:10:25.020 回答
1

任何基于套接字的 .NET 服务器应用程序都将涉及至少两种套接字:

  1. 用于侦听入站连接的侦听器套接字(同步或异步)
  2. 通过调用侦听器套接字的 Accept() 方法返回的客户端套接字。

您指的示例是异步侦听的示例,其中套接字首先以异步方法的地址作为参数调用 BeginAccept() 方法。现在,如果您不调用相应的 EndAccept() 方法,则原始侦听器套接字将被阻塞,并且来自客户端的任何进一步连接都可能丢失。

Socket.ShutDown(Both) 方法用于优雅地关闭带有连接的套接字,而 Socket.Disconnect(True) 将强制执行相同的操作。无论如何, Socket.Close() 应该遵循这些方法。有关更多信息,请参阅此 SO 链接:c#/.Net Socket.Shutdown

于 2012-08-17T22:56:14.657 回答