Когда вы вызываете функцию write()
, вы предоставляете буфер и количество байтов, которые хотите записать. Однако не гарантируется, что ОС отправит/запишет все байты, которые вы хотите записать, за один раз. (В случае блокирующих сокетов вызов write()
будет блокироваться до тех пор, пока он не скопирует весь фрагмент в буфер TCP. Однако в случае неблокирующих сокетов функция write() вернется и не будет блокироваться, а запишет только те байты, которые она может).
Стек TCP/IP работает в ОС, и каждая ОС будет иметь свою собственную реализацию стека. Этот стек будет определять размеры буфера, и, кроме того, TCP/IP сам позаботится обо всей низкоуровневой статистике, такой как MSS, доступный размер окна получателя, что позволит TCP запускать алгоритмы управления потоком и управления перегрузкой.
Поэтому лучше всего позволить TCP решить, как он хочет отправлять ваши данные. Вместо того, чтобы разбивать данные на фрагменты, позвольте стеку TCP сделать это за вас.
Просто будьте осторожны с тем, что всегда проверяется количество фактически отправленных байтов, которые возвращаются вызовом write()
.
person
Sumit Trehan
schedule
06.08.2015
send()
фактически отправляет меньше байтов, чем указано; вам придется зацикливаться в этом случае - person chill   schedule 06.08.2015size_t
, которое является параметромsend
, содержащим длину буфера, или вssize_t
, которое является возвращаемым значением, зависит от платформы; довольно часто эти числа равны 2 ^ 64-1 или 2 ^ 63-1 соответственно. - person chill   schedule 06.08.2015