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