小さな IRC サーバーを作成して、いくつかの新しいプログラミングの概念 (および私がずっと使用していない他の概念) を学習する実験を行っています。最初のステップは、TCP 経由で接続する基本的なクライアントを取得して、プレーンテキスト コマンドをサーバーに送信することです。
接続をリッスンするには、次のコードがあります。
public NetworkClient(Server server, TcpClient socket, int id)
{
_socket = socket;
_id = id;
_server = server;
}
private async void ListenForClients()
{
int numClients = 0;
while (IsRunning)
{
var tcpClient = await _listener.AcceptTcpClientAsync();
var netClient = new NetworkClient(this, tcpClient, numClients);
netClient.Start();
Console.WriteLine("Client Connected");
numClients++;
}
}
次に、私のNetworkClient
クラスでは、私のStart()
メソッドは次のようになります。
public async void Start()
{
using (var reader = new StreamReader(_socket.GetStream()))
{
while (_server.IsRunning)
{
var line = await reader.ReadLineAsync();
Console.WriteLine("Client {0} wrote: {1}", _id, line);
}
}
}
これは、Telnet クライアントが接続されている間はうまく機能しますが、いったん Telnet クライアントを閉じると、reader.ReadLineAsync();
常にnull
. チェックを追加して確認しline == null
ますが、クライアントが切断されたかどうかを検出する正しい方法かどうかはわかりません。
さらに悪いことに、_socket.Connected
null が によって「受信」されている間、常に true を返していますreader.ReadLineAsync()
。
TCP クライアントが切断されたことを検出する適切な方法は何ですか?