来自AsyncState的.NET套接字与EndAccept()函数之间的区别

时间:2012-08-17 21:17:42

标签: c# .net sockets asyncsocket

阅读此Async Sockets example时,我会找到以下代码:

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

我无法找到有关这两个套接字之间区别的文档,我也想知道如何关闭处理程序,或者关闭处理程序会影响原始套接字。任何人都可以解释一下,或者给我一些文档吗?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

侦听器是侦听连接的套接字。您不希望保持侦听器占用,否则多个客户端将无法通过该套接字进行连接。在该套接字上调用EndAccept为您提供了一个套接字,供服务器与客户端通信,并打开监听器以获得更多连接。

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

答案 2 :(得分:1)

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

  1. 用于侦听入站连接(同步或异步)的侦听器套接字
  2. 通过调用侦听器套接字的Accept()方法返回的客户端套接字。
  3. 您所指的示例是异步侦听的示例,其中套接字首先使用async方法的地址作为参数调用BeginAccept()方法。现在,如果您不调用相应的EndAccept()方法,则将阻止原始侦听器套接字,并且可能会丢失来自客户端的任何更新连接。

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