Я написал несколько небольших программ, которые обмениваются данными через TCP. У меня возникают бесконечные проблемы с зависанием системы, потому что одна программа закрыла свое сетевое соединение, а другая конечная точка каким-то образом не удалила уведомление, что оно теперь отключено.Обнаружение закрытого сетевого подключения
Я ожидал, что сделаю I/O по TCP-соединению, которое было закрыто, чтобы выбрасывать какое-то исключение ввода-вывода, но вместо этого программа, похоже, только висит, ожидая навсегда для другой конечной точки, чтобы ответить , Очевидно, что если соединение закрыто, этот ответ никогда не наступает. (Это даже не кажется тайм-аутом, если вы оставите его, скажем, двадцать минут.)
Есть ли способ я могу force удаленный конец «видеть», что я закрыл сетевое соединение ?
Update: Вот код ...
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);
}
}
В TCP процесс, как правило, не может вешать вечно ... TCP отправляет сигналы «alive?», Чтобы проверить, активен ли другой узел. –
... отсюда мой недоумение. – MathematicalOrchid
Вы считали «TcpClient.LingerState»? Как вы используете TCP? Программирование сокетов или какая-то специальная библиотека? –