私はクライアントを待ち受けるサーバーアプリケーションを持っています。 クライアントがインターネット接続を失い、サーバーとの接続が切断されました。クライアントソケットを切断したとき
クライアントが切断されたときにサーバーが自動的にチェックしますか?そのようなことをどうやって実装できますか?
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);
}
}
}
基本的に、クライアントにpingを実行するためにサーバー側でping機能を行い、応答がない場合はクライアントソケットを閉じるだけです。正しい?また、クライアントソケットを格納する最良の方法は何ですか? –
「ping」機能を作成する代わりに、クライアントとサーバーが接続されていると常に仮定することをお勧めします。送信時にエラーが発生するたびに、切断されたとみなすことができます。これは馬鹿だと思うが、あなたがそれについて考えているときには、あなたのping機能が鳴ったときに5秒前に接続されたからといって、データを送信するときに今接続されているわけではない。 –
私はあなたのクライアントソケットを、すべてのメンバーまたは処理コードがアクセス可能なコレクション(恐らく 'List')に保存します。おそらくクラスレベルのプロパティですが、コードの残りの部分に依存します。 –