Предположим, вы используете TCP. Когда вы вызываете send, данные, которые вы отправляете, немедленно помещаются в исходящую очередь и отправляются, а затем успешно завершаются. Однако если send не может поместить данные в исходящую очередь, send вернется с ошибкой.
Поскольку Tcp является протоколом гарантированной доставки, данные в исходящей очереди могут быть удалены только после получения подтверждения удаленным концом. Это связано с тем, что данные могут нуждаться в повторной отправке, если подтверждение не было получено вовремя.
Если удаленный конец работает медленно, исходящая очередь заполняется данными, а отправка блокируется, пока не останется места для размещения новых данных в исходящей очереди.
Однако соединение может прерваться, так что никакие дальнейшие данные не могут быть отправлены. Хотя после закрытия TCP-соединения любые дальнейшие отправки приведут к ошибке, у пользователя нет возможности узнать, сколько данных фактически попало на другую сторону. (Я не знаю способа получения бухгалтерии TCP из сокета в пользовательское приложение). Поэтому, если требуется подтверждение получения данных, вам, вероятно, следует реализовать это на уровне приложения.
Для UDP, я думаю, само собой разумеется, что какой-то способ сообщения о том, что было или не было получено, является обязательным.