Я пытаюсь отключить сеть только одного приемника.
Во-первых, я определяю размер 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);
)
Если вы хотите отправить с максимальной скоростью, write
должна блокироваться по умолчанию, когда это необходимо. Как только write
вернется, это будет сделано с вашим sendBuffer
и вы можете поместить в него следующий блок данных и снова вызвать write
.
Вам нужно только прибегнуть к select
если вы настроите сокет как неблокирующий, и в этом случае вы ожидаете того, что socet доступен для записи.
select
?