Кольцевой буфер Recv против простого буфера - PullRequest
1 голос
/ 19 марта 2012

Я работаю над клиент-серверным приложением.Мое приложение работает с пакетами переменного размера, каждый пакет имеет заголовок и полезную нагрузку переменной длины.

Моя дилемма - лучший подход для обработки пакетов при выполнении recv.Большинство учебных пособий, с которыми я сталкивался, предлагают использовать кольцевой буфер, но, насколько я могу судить, более эффективно использовать буфер, размер которого в два раза больше размера самого большого пакета, который вы можете обработать.

Если яиспользовать кольцевой буфер Мне нужен дополнительный буфер для recv, а затем мне нужно скопировать буфер в кольцевой буфер, что означает, что мне нужно сделать один или два memcpys, чтобы вставить буфер в кольцевой буфер

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

Я что-то не так понимаю?

PS.Если вы можете указать мне любой исходный код / ​​пример, где обрабатываются пакеты переменной длины, это было бы полезно.

1 Ответ

1 голос
/ 19 марта 2012

Если я использую кольцевой буфер, мне нужен дополнительный буфер для recv, а затем мне нужно скопировать буфер в кольцевой буфер, что означает, что мне нужно сделать один или два memcpys для вставки буфера в кольцевой буфер

Да, два чтения и записи, ничего страшного (*).Но вам не нужен дополнительный буфер.Для чтения просто максимизируйте чтение до места, оставшегося до конца кольцевого буфера.

(*): если вас беспокоит стоимость дополнительного системного вызова, для чтения / записи с разборкой / сборкой есть recvmsgи sendmsg.

...