Да, именно так. Типичная логика чтения выглядит следующим образом:
1) Звоните read
.
2) Мы получили EOF или ошибку? Если это так, вернитесь.
3) Получили ли мы все байты? Если это так, вернитесь.
4) Перейти к шагу 1.
Обратите внимание, что когда вы вызываете read
, вам нужно будет передать ему указатель на буфер после уже прочитанных данных, и вам нужно будет попытаться прочитать соответствующее количество байтов, которое не будет переполнить буфер. Кроме того, способ определения того, получили ли вы все байты, зависит от протокола.
Написать:
1) Вызвать write
, передав ему указатель на первый неписанный байт и количество неписанных байтов.
2) Мы получили ноль или ошибку? Если это так, вернитесь.
3) Мы записали все байты? Если это так, вернитесь.
4) Перейти к шагу 1.
Обратите внимание, что вы должны отрегулировать соответствующим образом для блокирующих или неблокирующих сокетов. Например, для неблокирующих розеток вы должны обработать EWOULDBLOCK
.