Чтение данных из сокета с использованием функции чтения - PullRequest
1 голос
/ 25 февраля 2011

Я пытаюсь прочитать данные, используя следующий код из сокета:

n = read(fd, buffer, 50000);

Вопрос в том, что когда данные с веб-сервера превышают размер пакета tcp, эти данные будут разбиты на несколько пакетов. В этом случае, будет ли функция чтения просто читать один пакет данных из fd, или она будет читать все пакеты из fd?

Обратите внимание, что функция чтения вызывается только один раз.

Ответы [ 2 ]

4 голосов
/ 25 февраля 2011

Поскольку вы используете TCP, ваш сокет имеет тип SOCK_STREAM. Сокет SOCK_STREAM является байтовым потоком и не поддерживает границы пакетов, поэтому вызов read() или recv() будет считывать данные, полученные из нескольких пакетов, если было получено несколько пакетов данных, и в вашем месте достаточно места. буфер. Он также может возвращать данные из части пакета, если ваш буфер недостаточно велик, чтобы вместить все данные. Следующий read() продолжит чтение со следующего байта.

0 голосов
/ 25 февраля 2011

Функция read получает максимально указанное количество байтов, в вашем примере 50000.

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

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