听力插座

时间:2010-05-05 07:34:48

标签: 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 = 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上直到新的连接出现,但是在第一个出现之后,它会永远挂起。我试图以较小的延迟不断地轮询它,比方说10微秒,然后它永远不会进入SelectMode.SelectRead。我想它可能在某种程度上与客户端的套接字重用相关?也许我没有关闭客户端套接字并且客户端(firefox)决定使用旧套接字?

我以这种方式断开客户端套接字:

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

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

1 个答案:

答案 0 :(得分:1)

您是否考虑过异步接受远程客户端?我TCPListener最近在Socket上,但listener.Socket.Poll( -1, SelectMode.SelectRead ) ) 类可以使用相同的模式。

我以前从未见过用过来检查客户端是否可以连接:

Sockets.TCPListener.Pending()

我使用.NET反射器查看了public bool Pending() { if (!this.m_Active) { throw new InvalidOperationException(SR.GetString("net_stopped")); } return this.m_ServerSocket.Poll(0, SelectMode.SelectRead); } 方法,他们有了这个,也许你可以尝试一下:

{{1}}

请记住,根据MSDN,answered a similar question方法是非阻塞的,所以不确定它是否会帮助您100%?