Обычно, если вы отключаете сеть на уровне ОС, запись в сокет должна вызывать исключения, поэтому вы знаете, что соединение разорвано.
Однако в более общем случае мы не можем быть уверены, что пакет доставлен. В java (вероятно, и в C) нет возможности проверить, подтвержден ли пакет ACK.
Даже если мы сможем проверить TCP ACK, это не гарантирует, что сервер или обработал пакет. Это означает только то, что целевая машина получила пакет и буферизировала его в памяти. После этого многое может пойти не так.
Поэтому, если вы действительно хотите быть уверены, вы не можете полагаться на транспортный протокол. У вас должен быть ACK уровня приложения, то есть серверное приложение записывает обратно сообщение ACK после того, как оно и обработало сообщение от клиента.
С точки зрения клиента, он пишет сообщение на сервер, а затем пытается прочитать ACK с сервера. Если он его получает, он может быть уверен, что его сообщение получено и обработано. Если он не может получить ACK, значит, он понятия не имеет, что произошло. Опытным путем, скорее всего, произошел сбой TCP. Следующая возможность заключается в том, что сервер рухнул. Также возможно, что все прошло нормально, за исключением того, что ACK не смог дойти до клиента.
person
irreputable
schedule
14.08.2010