Почему TcpClient.Write не создает исключение при записи в закрытое соединение (в первый раз)? - PullRequest
3 голосов
/ 19 августа 2009

У меня есть простая программа, которая использует TcpClient и SslStream для записи данных в сокет.

Чтобы проверить это, я запустил программу за ночь, чтобы моя программа открывала соединение, долго ничего не писала, чтобы брандмауэр или удаленный сервер закрывали соединение. Этим утром я посмотрел на TCPView и убедился, что соединение закрыто, а затем сказал моей программе записать в сокет.

Не было сгенерировано исключение при записи. Однако при следующей записи было сгенерировано исключение, как и ожидалось: «System.IO.IOException: невозможно записать данные в транспортное соединение: существующее соединение было принудительно закрыто удаленным хостом»

Я могу понять, почему TcpClient.Connected мог возвращать True, даже если он действительно не был подключен, но почему бы Write не выдавал исключение для соединения, которое было фактически закрыто (как проверено в TCPView)?

1 Ответ

5 голосов
/ 19 августа 2009

Это из-за того, как работает протокол TCP / IP. При вызове TcpClient.Write данные отправляются на сервер, и функция возвращает успех, не ожидая ответа сервера.

Тем временем сервер возвращает ошибку. Стек Tcp / IP на вашей стороне замечает, что в следующий раз, когда вы попытаетесь записать его, он выдаст исключение

...