私は、TCP 経由で通信する小さなプログラムをいくつか作成しました。あるプログラムがネットワーク接続を閉じたため、システムがハングするという無限の問題が発生し、他のエンドポイントは切断されたことに何らかの形で気付かない.
ある種の I/O 例外をスローするために閉じられた TCP 接続で I/O を実行することを期待していましたが、代わりに、プログラムがただハングしているように見え、他のエンドポイントが応答するのを永遠に待っています。明らかに、接続が閉じられている場合、その返信は決して来ません。(たとえば、20分間放置してもタイムアウトしないようです。)
ネットワーク接続を閉じたことをリモート エンドに強制的に「表示」させる方法はありますか?
更新:ここにいくつかのコードがあります...
public sealed class Client
{
public void Connect(IPAddress target)
{
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipAddress, 1177);
_stream = new NetworkStream(socket);
}
public void Disconnect()
{
_stream.Close();
}
}
public sealed class Server
{
public void Listen()
{
var listener = new TcpListener(IPAddress.Any, 1177);
listener.Start();
var socket = listener.AcceptSocket();
_stream = new NetworkStream(socket);
...
}
public void Disconnect()
{
socket.Shutdown(SocketShutdown.Both);
socket.Disconnect(false);
}
}