C# AsyncState和EndAccept()函数的.NET套接字之间的差异

C# AsyncState和EndAccept()函数的.NET套接字之间的差异,c#,.net,sockets,asyncsocket,C#,.net,Sockets,Asyncsocket,通读此文时,我发现以下代码: // Get the socket that handles the client request. Socket listener = (Socket) ar.AsyncState; Socket handler = listener.EndAccept(ar); 我很难找到关于这两个套接字之间的区别的文档,我也想知道关闭处理程序或关闭处理程序将如何影响原始套接字。有人能解释一下,或者给我指一些文档吗?侦听器就是侦听连接的套接字。您不想让

通读此文时,我发现以下代码:

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

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

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


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

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

  • 侦听器套接字,用于侦听入站连接(同步或异步)
  • 通过调用侦听器套接字的Accept()方法返回的客户端套接字
  • 您提到的示例是异步侦听,其中套接字首先调用beginacept()方法,并将异步方法的地址作为参数。现在,如果不调用相应的EndAccept()方法,原始侦听器套接字将被阻止,来自客户端的任何其他连接都可能丢失


    Socket.ShutDown(Both)方法用于优雅地关闭具有连接的套接字,而Socket.Disconnect(True)将强制执行相同的操作。在任何情况下,Socket.Close()都应该遵循以下方法。请参阅此SO链接了解更多信息:

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

    EndAccept
    通常是建立连接后所需做的全部操作。
    侦听器
    通常会继续侦听以获取更多要接受的连接。如果没有,通常只需释放或关闭套接字即可停止侦听并取消任何挂起的接受。
    处理程序
    用于执行应用程序需要的任何通信,完全独立于
    侦听器
    套接字。当您使用完
    处理程序
    套接字后,您会处理或关闭它,因为
    侦听器
    是独立的,所以它会继续“运行”


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

    谢谢您提供的信息。对处理程序调用ShutDown()怎么样?有什么见解吗?也许我根本不需要调用它——这很好,Socket接口是一堆只在某些使用上下文中才有意义的方法。因此,我的想法是,我不需要关闭处理程序。您可能应该在处理完处理程序套接字后关闭它,或者该端口将保持打开状态,直到进程退出。关闭处理程序套接字不会影响侦听器套接字,因此您仍然可以获得传入连接。您的插座是否存在特定问题?