Есть ли в Winsock эквивалент TCP_CORK?

Во многих реализациях TCP UNIX опция сокета TCP_CORK предоставляется, что позволяет вызывающей стороне обойти алгоритм Nagle и явно указать, когда отправлять физический пакет. Есть ли аналогичная функция в Windows (Winsock)?

TCP_CORK (начиная с Linux 2.2)

Если установлено, не отправляйте частичные кадры. Все поставленные в очередь частичные кадры отправляются при повторной очистке опции. Это полезно для добавления заголовков перед вызовом sendfile(2) или для оптимизации пропускной способности. В настоящее время реализовано ограничение времени в 200 миллисекунд на время, в течение которого выходной сигнал обрабатывается TCP_CORK. Если этот потолок достигнут, данные в очереди передаются автоматически. Эта опция может быть объединена с TCP_NODELAY только начиная с Linux 2.5.71. Эта опция не должна использоваться в коде, предназначенном для переносимости.

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

2 ответа

Решение

Я успешно использую TCP_NODELAY, чтобы получить поведение в стиле TCP_CORK. Я делаю это так:

  1. снимите флажок TCP_NODELAY на сокете
  2. Вызовите send() ноль или более раз, чтобы добавить свои исходящие данные в очередь Nagle
  3. установить флаг TCP_NODELAY на сокете
  4. вызовите send() с аргументом количества байтов, установленным в ноль, для принудительной немедленной отправки данных в очереди Nagle

Это прекрасно работает для меня под Windows, MacOS/X и Linux. (Обратите внимание, что в Linux окончательный нулевой байт send() не требуется)

Там нет эквивалента. Лучшее, что вы можете сделать, это сначала собрать ваши данные в ваш собственный буфер, а затем отправить готовый буфер в сокет, когда будете готовы, и позволить Nagle нормально обрабатывать пакеты.

Другие вопросы по тегам