Как узнать, пуст ли буфер отправки Windows Sockets? - PullRequest
4 голосов
/ 24 ноября 2011

Мне нужно знать, когда буфер отправки Windows-сокета пуст, то есть когда он был подключен к сети. SIO_FLUSH, похоже, ничего не делает, кроме как уничтожает содержимое этого буфера, вместо того, чтобы ждать, пока TCP не завершит его отправку.

Причина, по которой мне это нужно, заключается в том, что я не должен начинать отправку данных по отдельному соединению до тех пор, пока все данные по соединению под рукой не будут отправлены (или ближе всего к этому).

Это может показаться очень странным требованием, которое пахнет как плохие протоколы, но протокол HTTP, и он прошел через все это :). Мне требуется передавать большие объемы данных в браузер в режиме реального времени, и время задержки сети не позволяет мне запрашивать больше данных, когда поступают данные, поскольку это замедляет запросы на основе задержки, а не только пропускной способности. Идеальным решением будет бесконечный запрос, который получает 1 поток данных в реальном времени, но, как уже говорилось, я должен использовать HTTP, который не поддерживает это. У меня нет контроля над реализацией HTTP на стороне клиента (строго запрос-ответ).

Итак, чтобы оптимизировать использование полосы пропускания и максимально приблизиться к данным в реальном времени, мне нужно знать, когда отправляется буфер на соединении 1, прежде чем отправлять данные соединения 2 (данные генерируются в реальном времени и не должны быть несвежим).

Если кто-нибудь знает, как этого добиться, пожалуйста, дайте мне знать.

1 Ответ

3 голосов
/ 24 ноября 2011

В Windows нет способа запросить состояние буфера отправки.

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

Если отправитель использует вместо этого неблокирующий сокет, сокет сообщит об ошибке WSAEWOULDBLOCK, когда буферзаполняется, а затем более позднее уведомление FD_WRITE сообщит отправителю, когда буфер отправки освободил место.

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

В зависимости от характера данных вашего ответа, в HTTP можно использовать либо функцию HTTP 1.1 Transfer-Encoding: chunked, либо различный сервер, выдвигающий techniqus, для типа ситуации, которую вы используете.описать.Независимо от того, поддерживает ли ваш HTTP-клиент какой-либо из них, это отдельный вопрос.

...