2012-03-19 4 views
0

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

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

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

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

Я получаю что-то неправильно?

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

+0

Этот TCP или UDP? –

+0

@KarolyHorvath это TCP –

+1

почему голос? –

ответ

1

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

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

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

+0

Да, я мог бы вызвать recv с len = свободное пространство кольцевого буфера, но это означало бы, что я потеряю некоторую пропускную способность, поскольку я мог бы завершить вызов recv с очень маленькими значениями для параметра длины –

+0

(*). и это, вероятно, не имеет значения. такие оптимизационные решения имеют значение только на серверах с очень высокой производительностью. –

+0

Вы правы. Но я до сих пор не понимаю, каковы преимущества использования кольцевого буфера над простым буфером –

Смежные вопросы