Неблокирующая write(2)
означает, что при любых трудностях звонок будет возвращен. Правильный способ определить, что произошло, - проверить возвращаемое значение функции.
Если возвращается -1, проверьте errno
. Значение EAGAIN
означает, что write
сделал не произошло, и вам придется сделать это снова.
Он также может возвращать короткую запись (т. Е. Значение меньше размера буфера, который вы передали), и в этом случае вы, вероятно, захотите повторить пропущенную часть.
Если это происходит с недолговечными сокетами, также прочитайте Последняя страница SO_LINGER, или: почему мой tcp ненадежен . Это объясняет особую проблему, связанную с закрывающей частью трансмиссии.
когда мы наивно используем TCP только для отправки данных, которые нам нужно передать, он часто не может делать то, что нам нужно - последние килобайты или иногда мегабайты передаваемых данных так и не поступают.
и выводы таковы:
Лучший совет - отправить информацию о длине и заставить удаленную программу активно подтверждать, что все данные были получены.
Также описывается взлом для Linux.