C# 监听插座

C# 监听插座,c#,sockets,C#,Sockets,我遇到了一个奇怪的问题,我以前从未真正过期过,下面是服务器的代码(本例中的客户端是firefox),我创建它的方式: _Socket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp ); _Socket.Bind( new IPEndPoint( Settings.IP, Settings.Port ) ); _Socket.Listen( 1000 ); _Socket.Blocking

我遇到了一个奇怪的问题,我以前从未真正过期过,下面是服务器的代码(本例中的客户端是firefox),我创建它的方式:

_Socket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
_Socket.Bind( new IPEndPoint( Settings.IP, Settings.Port ) );
_Socket.Listen( 1000 );
_Socket.Blocking = false;
我接受连接的方式:

while( _IsWorking )
{
    if( listener.Socket.Poll( -1, SelectMode.SelectRead ) )
    {
        Socket clientSocket = listener.Socket.Accept();
        clientSocket.Blocking = false;
        clientSocket.SetSocketOption( SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true );
    }
}
所以我希望它一直挂在listener.Socket.Poll上,直到新连接出现,但在第一个连接出现后,它将永远挂在Poll上。我试着以较小的延迟不断地轮询它,比如说10微秒,然后它就再也不会进入SelectMode.SelectRead。我想这可能与客户端的套接字重用有关?也许我没有正确关闭客户端套接字,而客户端(firefox)决定使用旧的套接字

我通过以下方式断开客户端套接字:

Context.Socket.Shutdown( SocketShutdown.Both ); // context is just a wrapper around socket
Context.Socket.Close();

什么原因可能导致该问题?

您是否考虑过异步接受远程客户端?我最近在
TCPListener
上使用了相同的模式,但在
Socket
类上也可以使用相同的模式

我以前从未见过使用此选项检查客户端是否可以连接:

listener.Socket.Poll( -1, SelectMode.SelectRead ) )
我查看了使用.NET reflector的
Sockets.TCPListener.Pending()
方法,它们有以下功能,也许您可以试试:

public bool Pending()
{
    if (!this.m_Active)
    {
        throw new InvalidOperationException(SR.GetString("net_stopped"));
    }
    return this.m_ServerSocket.Poll(0, SelectMode.SelectRead);
}

请记住,根据MSDN,该方法是非阻塞的,因此不确定它是否能100%帮助您?

我想我找到了我描述的行为的原因,这是因为在处理客户端套接字之后,我没有断开它,并且在由于某种原因无法建立新连接之后,我想这与客户端的(本例中的firefox)希望使用一个套接字(如果服务器没有关闭),直到它成为可能。事实上,你提到的问题中的那个家伙做得完全错误:)而且我实际上没有提到他在等待检查之间睡觉,我不知道他是为了什么目的以非阻塞方式进行监听。。