2011-02-18 21 views
1

私はクライアントを待ち受けるサーバーアプリケーションを持っています。 クライアントがインターネット接続を失い、サーバーとの接続が切断されました。クライアントソケットを切断したとき

クライアントが切断されたときにサーバーが自動的にチェックしますか?そのようなことをどうやって実装できますか?

Main.cs http://pastebin.com/fHYpErz7

ServerSocket.cs:http://pastebin.com/erw4tzdp

Client.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Sockets; 

namespace jM2 
{ 
    class Client 
    { 
     private int clientConnectionID; 
     private Socket clientSocket; 
     private string clientIP; 
     private byte[] clientBuffer = new byte[1024]; 

     public Client(int connectionID, Socket connectionSocket) 
     { 
      clientConnectionID = connectionID; 
      clientSocket = connectionSocket; 
      clientIP = connectionSocket.RemoteEndPoint.ToString(); 
      clientSocket.BeginReceive(clientBuffer, 0, clientBuffer.Length, SocketFlags.None, new AsyncCallback(dataArrival), null); 
     } 
     public void Disconnect() 
     { 
      clientSocket.Close(); 
     } 
     private void dataArrival(IAsyncResult iar) 
     { 
      int bytesReceived = clientSocket.EndReceive(iar); 
      clientSocket.BeginReceive(clientBuffer, 0, clientBuffer.Length, SocketFlags.None, new AsyncCallback(dataArrival), null); 
     } 
    } 
} 

答えて

2

はこの質問に私の答えを参照してください:基本的に

TcpClient.Close doesn't close the connection

なし私は知っているfデータを送信しようとするまで、接続は閉じられます。失敗した場合、接続は閉じられます。

+0

基本的に、クライアントにpingを実行するためにサーバー側でping機能を行い、応答がない場合はクライアントソケットを閉じるだけです。正しい?また、クライアントソケットを格納する最良の方法は何ですか? –

+4

「ping」機能を作成する代わりに、クライアントとサーバーが接続されていると常に仮定することをお勧めします。送信時にエラーが発生するたびに、切断されたとみなすことができます。これは馬鹿だと思うが、あなたがそれについて考えているときには、あなたのping機能が鳴ったときに5秒前に接続されたからといって、データを送信するときに今接続されているわけではない。 –

+0

私はあなたのクライアントソケットを、すべてのメンバーまたは処理コードがアクセス可能なコレクション(恐らく 'List ')に保存します。おそらくクラスレベルのプロパティですが、コードの残りの部分に依存します。 –

0

クリス・ハースの言葉によると、私は間違っているかもしれませんが、私は以前にTCPサーバーを作成し、0バイトを受け取ったときにクローズド接続を検出しました。つまり、dataArrivalメソッドでbytesReceivedが0の場合は、接続が終了したことを示します。これは、かなり広範なテストを通じて動作するように見えました。

0

"poll"または "heartbeat"というメッセージのタイプをお勧めします。as described here

関連する問題