Используйте сокет io в C ++ для динамического числа байтов - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь реализовать простое клиент-серверное приложение, в котором клиент или сервер могут отправлять динамическое число байтов за один write() вызов.

Например, предположим, что клиентотправляет поток байтов 1500 байтов.И сервер читает каждые 1000 байт.

int BUFFER_SIZE = 1000;
...
read( iSockFD, cBuffer, BUFFER_SIZE );

Я могу использовать цикл и вызывать read до тех пор, пока его возвращаемое значение не станет 0.Но у клиента может быть несколько write() вызовов в цикле (то есть, отправка нескольких сообщений).

Мой вопрос, повлияет ли это на read() на стороне сервера?Это означает, что два последовательных write() из 1000 байт на стороне клиента будут считываться одним read() с размером буфера 2000 байт на стороне сервера?

Если это так, каковы рекомендуемые способыреализации такого сценария?Должен ли я использовать разделитель для сообщений (используя алгоритм кодирования)?

Я понимаю, что это больше относится к сокетам, а не к C ++.Но ваша помощь и руководство высоко ценятся.

ОБНОВЛЕНИЕ :

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

1 Ответ

0 голосов
/ 30 ноября 2018

Никто не может гарантировать вам, что запись (x) вызовет чтение (x) на стороне получателя.Если x больше, чем ваш буфер приема сокета, или если вы вызываете read () до того, как все сообщение будет получено в буфере приема сокета, то read () вернет только часть данных и потребует от вас последующего чтения(), чтобы получить остальное.

Рекомендуемый способ сделать это - определить буфер сообщений достаточного размера.Каждый вызов read () будет возвращать 1 или более байтов, которые вы продолжаете помещать в буфер.Теперь, когда размер буфера превышает 4 байта + be32toh (целое число), хранящееся в первых 4 байтах буфера, вы должны использовать целое число плюс следующие x байтов из начала буфера (и обрабатывать их дальше).Это позволит вам хорошо обрабатывать случаи, когда read () содержит конец ранее незаконченного пакета и в то же время содержит начало следующего (неполного) пакета.

Просто убедитесь, что каждая полезная нагрузка, которую вы передаетедобавляется htobe32 (длина).

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