阅读此Async Sockets example时,我会找到以下代码:
// Get the socket that handles the client request.
Socket listener = (Socket) ar.AsyncState;
Socket handler = listener.EndAccept(ar);
我无法找到有关这两个套接字之间区别的文档,我也想知道如何关闭处理程序,或者关闭处理程序会影响原始套接字。任何人都可以解释一下,或者给我一些文档吗?
答案 0 :(得分:2)
套接字是特定计算机上的唯一连接,即127.0.0.1:1024
。一次只能建立一个活动连接。 “监听器”侦听修复端口(例如上面示例中的1024)。它的工作是成为接受联系的“公共”方式。一旦它接受连接,它就会在一个新的,随机的(好的,合理的伪随机的)选择端口上创建一个新的套接字。然后,原始连接应用程序和主机可以通过该套接字进行通信,从而释放侦听套接字以获得另一个连接(这将为新连接发送另一个端口号,等等。)
EndAccept
。 listener
通常会继续监听更多接受。如果没有,您通常只需处置或关闭套接字以停止收听并取消任何待处理的接受。 handler
用于完成应用程序所需的任何通信,完全独立于listener
套接字。完成handler
套接字后,您将处置或关闭它,并且因为listener
是独立的,它会继续“运行”。
Shutdown
将刷新面向连接的套接字上的任何挂起数据(在Close
之前调用)并且不会影响任何其他套接字。
答案 1 :(得分:1)
侦听器是侦听连接的套接字。您不希望保持侦听器占用,否则多个客户端将无法通过该套接字进行连接。在该套接字上调用EndAccept为您提供了一个套接字,供服务器与客户端通信,并打开监听器以获得更多连接。
关闭处理程序不应该影响侦听器套接字。
答案 2 :(得分:1)
任何基于套接字的.NET服务器应用程序都将涉及至少两种套接字:
您所指的示例是异步侦听的示例,其中套接字首先使用async方法的地址作为参数调用BeginAccept()方法。现在,如果您不调用相应的EndAccept()方法,则将阻止原始侦听器套接字,并且可能会丢失来自客户端的任何更新连接。
Socket.ShutDown(Both)方法用于正常关闭具有连接的套接字,而Socket.Disconnect(True)将强制执行相同的操作。无论如何,Socket.Close()应该遵循这些方法。有关详细信息,请参阅此SO链接:c#/.Net Socket.Shutdown