如何断开TcpClient以允许新连接?

时间:2011-01-28 10:18:08

标签: .net sockets tcp network-programming c++-cli

我有一个TcpListener,它等待新的套接字连接。当建立新连接时,来自远程用户的一些其他代码服务消息。我会定期检查新连接,如果有新连接,则应删除旧连接。

以前我只是打开新连接,大部分工作都没问题。有时候,我在重新使用同一个端口时遇到问题,所以我认为关闭该连接会更好(我认为这也应该让老用户知道连接已经死亡)。

以下代码是我尝试这样做的,但由于某种原因,Disconnect调用似乎无限期阻止。有办法阻止吗? ......或者我在这里错过了其他的东西?

while(1)
{
    // FYI, m_server is a TcpListener^ and m_client is a TcpClient^
        // Check for new client connections
    if (m_server->Pending() == true)
    {
        if( m_stream != nullptr )
        {
            m_client->Client->Shutdown( SocketShutdown::Both ); // Stop sending / receiving
            m_client->Client->Disconnect(true); // Disconnect the underlying network stream
            m_client->Client->Close(); // Disconnect the underlying network stream
            m_client->Close();
            delete m_client;
            m_client = nullptr;
        }

        m_client = m_server->AcceptTcpClient(); //grab the TCP client
        m_stream = m_client->GetStream();  //create the stream at the same time
    }

    // ...go and service pending messages on the client stream
}

The docs on the Disconnect() function建议我可以设置超时但他们没有提到怎么做?

  

如果您需要在不先调用Shutdown的情况下调用Disconnect,则可以将DontLinger套接字选项设置为false并指定非零超时间隔,以确保发送排队等待传出传输的数据。断开然后阻塞,直到发送数据或直到指定的超时到期。如果将DontLinger设置为false并指定零超时间隔,则Close会释放连接并自动丢弃传出的排队数据。

[编辑] 我通过将m_client->Client->Disconnect(true);更改为m_client->Client->Disconnect(false);找到了解决超时问题的方案,但仍然没有警告我的客户端套接字已关闭。我已经尝试了所有我能想到的东西来测试,但它们都成功了:

// m_client is a TcpClient^
bool stillConnected = ( (m_client != nullptr) &&
                        (m_client->Connected == true) &&
                        (m_client->Client != nullptr) &&
                        (m_client->Client->Connected == true) );
即使在另一个客户端连接到服务器并因此调用上面的所有关闭位之后,

stillConnected也始终为真。这就像我在问题的顶部提到的关闭的东西是没有正确关闭套接字或什么?

1 个答案:

答案 0 :(得分:1)

当读取返回成功且零字节长度时,检测到断开TCP套接字(从远程端发送FIN标志)。