C: отправка длинных строк с помощью send () - PullRequest
0 голосов
/ 22 сентября 2010

Я использую Linux и пытаюсь отправить длинное сообщение через send ().Сообщение имеет размер 1270 байт, но мое клиентское приложение получает только 1024 байта.

Поскольку 1024 байта - это такое удобное число, я предполагаю, что send () может отправлять только 1024 байта за раз.Я посмотрел справочную страницу для отправки, но все, что она говорит о длинных сообщениях:

Когда сообщение не помещается в буфер отправки сокета, send () обычно блокируется, если только сокетбыл переведен в неблокирующий режим ввода / вывода.В неблокирующем режиме в этом случае произойдет ошибка EAGAIN или EWOULD-BLOCK.Вызов select (2) может использоваться, чтобы определить, когда можно отправить больше данных.

Я использую режим блокировки, и страница руководства не говорит, что делать.Мой точный вызов для отправки выглядит следующим образом: send(socket, message, strlen(message), 0);

Нужно ли разбивать строку на 1024-байтовые куски и отправлять их отдельно?И как мой клиент справится с этим?Если моему клиенту нужно что-то сделать, я просто упомяну, что он на Java и использует InputStreamReader для получения данных.

Ответы [ 2 ]

5 голосов
/ 22 сентября 2010

С вашей стороны есть недоразумение относительно того, как на самом деле работает send. Он не отправляет то, что вы на него бросаете, он отправляет самое большее количество байтов, которые вы передаете в качестве параметра. Это означает, что вы должны проверить возвращаемое значение send, удалить количество байтов, которые фактически были отправлены из вашей очереди отправки, и попытаться отправить оставшиеся данные с другим вызовом для отправки. Кстати, то же самое относится и к recv.

1 голос
/ 22 сентября 2010

В дополнение к тому, что сказал Джим Бриссом , стоит отметить, что SOCK_STREAM сокеты (т. Е. TCP) делают , а не имеют концепцию границ сообщений - соединение только один длинный неструктурированный поток байтов.

То, что вы отправили 100 байтов (скажем) одним вызовом send(), означает не , что означает, что он поступит в виде 100 байтов за один recv() вызов. В крайнем случае, он может поступать в 100 отдельных recv() с по 1 байту каждый - или в другое, он может поступать как часть большего recv() вместе с предыдущими или последующими данными.

Ваш получатель должен быть в состоянии справиться с этим - если вам нужно определить отдельные сообщения в потоке, вы должны наложить некую структуру на сам поток, на прикладном уровне.

...