Кольцевой буфер Recv против простого буфера
Я работаю над клиент-серверным приложением. Мое приложение работает с пакетами переменного размера, каждый пакет имеет заголовок и полезную нагрузку переменной длины.
Моя дилемма в том, что лучше всего подходит для обработки пакетов при выполнении recv. Большинство учебных пособий, с которыми я сталкивался, предлагают использовать кольцевой буфер, но, насколько я могу судить, более эффективно использовать буфер, размер которого в два раза больше размера самого большого пакета, который вы можете обработать.
Если я использую кольцевой буфер, мне нужен дополнительный буфер для recv, а затем мне нужно скопировать буфер в кольцевой буфер, что означает, что мне нужно сделать один или два memcpys, чтобы вставить буфер в кольцевой буфер
Если я использую подход с одним буфером, мне нужен только один буфер, который я могу передать вызову recv, и вызов memmove, чтобы переместить данные в начало буфера, когда я получил полный пакет, и все еще есть данные, принадлежащие другому пакету в буфере,
Я что-то не так делаю?
PS. Если вы можете указать мне на любой исходный код / пример, где обрабатываются пакеты переменной длины, это было бы полезно.
1 ответ
Если я использую кольцевой буфер, мне нужен дополнительный буфер для recv, а затем мне нужно скопировать буфер в кольцевой буфер, что означает, что мне нужно сделать один или два memcpys, чтобы вставить буфер в кольцевой буфер
Да, два чтения и записи, ничего страшного (*). Но вам не нужен дополнительный буфер. Для чтения просто максимизируйте чтение до свободного места до конца кольцевого буфера.
(*): Если вас беспокоит стоимость дополнительного системного вызова, для разброса / сбора и чтения / записи есть recvmsg
а также sendmsg
,