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