我遇到了一个奇怪的问题,我之前从未真正解决这个问题,这里是服务器的代码(客户端在这种情况下是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();
可能导致该问题的原因是什么?
答案 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%?