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

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

Во-первых, я определяю размер 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() чтобы повторно очистить буфер отправки (наиболее оптимальным способом)?

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

0

Решение

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

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

3

Другие решения


По вопросам рекламы [email protected]