Сколько я должен ждать, пока буфер отправки сокета не станет пустым в C ++?

0

Я пытаюсь отключить сеть только одного приемника.

Во-первых, я определяю размер SO_SNDBUF:

getsockopt(sendsockfd, SOL_SOCKET, SO_SNDBUF, &sndBufferSize, &sbsLen);

Затем я продолжаю заполнять этот буфер, пока он не будет полностью заполнен:

if (sndBufferSize - NbBytesInBuffer >= HEADER){
    memcpy (sendBuffer + NbBytesInBuffer, &buf_header, HEADER);
    NbBytesInBuffer +=HEADER;
}

Конечно, я упоминаю только соответствующую часть моего кода.

Наконец, когда буфер заполнен, напишите в сокет.

if (sndBufferSize - NbBytesInBuffer < HEADER)
sentSize = write(sendsockfd,sendBuffer,NbBytesInBuffer);
...

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

Теперь, поскольку я хочу отправить максимально возможную ставку, мне нужно подождать как можно меньше. (т.е. мне нужно повторно отправить сразу же буфер отправки пуст).

Как определить необходимое время для write(), чтобы повторно очистить буфер отправки (наиболее оптимальным способом)?

PS Пожалуйста, не говорите мне ждать произвольного времени (например, usleep(10000);)

  • 1
    Вы рассматривали select ?
  • 0
    У меня только один приемник. Я отредактировал свой вопрос
Показать ещё 3 комментария
Теги:
sockets

1 ответ

3
Лучший ответ

Если вы хотите отправить с максимальной скоростью, write должна блокироваться по умолчанию, когда это необходимо. Как только write вернется, это будет сделано с вашим sendBuffer и вы можете поместить в него следующий блок данных и снова вызвать write.

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

  • 0
    Ты прав. Это то, о чем я думаю. Просто дай мне проверить это.
  • 0
    Я не знаю, что происходит. Но я попробовал это раньше и столкнулся с некоторыми проблемами с памятью :) В любом случае, большое спасибо.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню