2011-01-28 18 views
1

新しいソケット接続を待つTcpListenerがあります。新しい接続が確立されると、リモートユーザーからの他のコードサービスメッセージが表示されます。定期的に新しい接続を確認し、新しい接続が作成された場合は、古い接続を削除する必要があります。新しい接続を許可するためにTcpClientを切断するにはどうすればよいですか?

以前はほとんどの場合、大丈夫だった新しい接続を開いていました。時には、私は同じポートを再使用している問題を抱えていたので、その接続を閉じる方が良いと思いました(これは、古いユーザーに接続が壊れていることを示すはずです)。

以下のコードは私の試みですが、何らかの理由で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私が設定することができますが、それらはどのように言及していないタイムアウトがあります示唆?

最初にシャットダウンを呼び出さずに切断を呼び出す必要がある場合は、DontLinger Socketオプションをfalseに設定し、送信にキューイングされたデータが確実に送信されるようにゼロ以外のタイムアウト間隔を指定できます。データが送信されるか、または指定されたタイムアウトが切れるまでブロックしてからブロックします。 DontLingerをfalseに設定してタイムアウト時間をゼロに設定すると、Closeは接続を解放し、送信キューに入れられたデータを自動的に破棄します。

[編集]

は私が m_client->Client->Disconnect(false);から m_client->Client->Disconnect(true);を変更することにより、タイムアウト問題の解決策を見つけたが、それはまだソケットが閉じられたことを、私のクライアントに警告しません。私は、私がテストに考えることができるすべてを試みたが、それらはすべて成功する:

// m_client is a TcpClient^ 
bool stillConnected = ((m_client != nullptr) && 
         (m_client->Connected == true) && 
         (m_client->Client != nullptr) && 
         (m_client->Client->Connected == true)); 

stillConnectedは、別のクライアントがサーバに接続され、したがって、上記の全てのシャットダウンこまごまと呼ばれた後であっても常に真です。それは私の質問のトップに述べたシャットダウンのようなものですが、ソケットを適切に閉じていないのでしょうか?

+0

これはC++/CLIですか?そうですか? – abatishchev

+0

はい、それは問題ですが、根本的なハードウェアとやりとりするために使用している言語ではなく、.net/windows networkingと関係があると思いますか? –

答えて

1

読み取りが成功し、ゼロバイトの長さが返されると、TCPソケット(リモートエンドからフラグが送信されます)が切断されます。

+0

あなたの提案は正しい軌道に乗りました。ドロップを検出するために読み取り操作を実行する必要がありました。 –

関連する問題