我正在使用TcpListener来接收消息。我们的一个客户遇到一个问题,即收听者在收到消息后偶尔不会重新连接。我的重新连接代码非常基础,直接来自TcpListener API。
tcpClientConnected = new ManualResetEvent(false);
server = new TcpListener(IPAddress.Any, Port);
server.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
server.Start();
while (isListening)
{
Parent.Log("******************** WAITING FOR A MESSAGE ********************", Verbose.Debug);
tcpClientConnected.Reset();
server.BeginAcceptTcpClient(new AsyncCallback(AcceptMessage), server);
tcpClientConnected.WaitOne(); // Wait for an incoming message
if(isListening)
Parent.Log("******************** CONNECTION RESET ********************", Verbose.Debug);
else
Parent.Log("******************** LISTENER DISCONNECTED ********************", Verbose.Debug);
}
由于记录,我知道tcpClientConnected.Set()
被调用。 IsListening仍然是,并且代码循环回BeginAcceptTcpClient。 AcceptMessage中的第一行代码写入日志,并且永远不会被命中。因此,我知道永远不会收到新消息,服务器会锁定。
此客户可以成功运行几天,然后锁定。这只发生在一个客户身上。在我的AcceptMessage代码中,我使用了using语句:
TcpListener listener = (TcpListener)ar.AsyncState;
using (TcpClient client = listener.EndAcceptTcpClient(ar))
using (NetworkStream stream = client.GetStream())
创建客户端后我没有引用监听器。在这段代码中,我允许多缓冲区消息,但我认为没有任何东西导致问题。
我的问题是,为什么BeginAcceptTcpClient没有连接,我可以做些什么来检测这个并让它在需要时再试一次?