C Программирование сокетов Unix, обеспечение количества байтов чтения / записи? - PullRequest
0 голосов
/ 16 января 2012

Я пишу клиентские и серверные программы и ищу способ гарантировать, что все байты читаются и все байты отправляются при использовании read () или write () в / из сокетов, открытых клиентом / сервером .

Я предполагаю, что мне придется использовать цикл для проверки количества байтов, возвращаемых функциями чтения или записи.

Примерно так:

#define BUFFER 20
char buffer[BUFFER];

while (I haven't read all bytes from the buffer){
       int bytesRead = read(theSocket, myWord, BUFFER);
 }

И как я могу убедиться, что все байты, которые я пытаюсь передать с помощью write (), были переданы?

Спасибо за любую помощь!

1 Ответ

1 голос
/ 16 января 2012

Да, именно так. Типичная логика чтения выглядит следующим образом:

1) Звоните read.

2) Мы получили EOF или ошибку? Если это так, вернитесь.

3) Получили ли мы все байты? Если это так, вернитесь.

4) Перейти к шагу 1.

Обратите внимание, что когда вы вызываете read, вам нужно будет передать ему указатель на буфер после уже прочитанных данных, и вам нужно будет попытаться прочитать соответствующее количество байтов, которое не будет переполнить буфер. Кроме того, способ определения того, получили ли вы все байты, зависит от протокола.

Написать:

1) Вызвать write, передав ему указатель на первый неписанный байт и количество неписанных байтов.

2) Мы получили ноль или ошибку? Если это так, вернитесь.

3) Мы записали все байты? Если это так, вернитесь.

4) Перейти к шагу 1.

Обратите внимание, что вы должны отрегулировать соответствующим образом для блокирующих или неблокирующих сокетов. Например, для неблокирующих розеток вы должны обработать EWOULDBLOCK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...