TcpListener在重新连接时冻结

时间:2017-10-18 18:03:32

标签: c# tcplistener

我正在使用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没有连接,我可以做些什么来检测这个并让它在需要时再试一次?

0 个答案:

没有答案