Есть ли в 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. Я делаю это так:
- снимите флажок TCP_NODELAY на сокете
- Вызовите send() ноль или более раз, чтобы добавить свои исходящие данные в очередь Nagle
- установить флаг TCP_NODELAY на сокете
- вызовите send() с аргументом количества байтов, установленным в ноль, для принудительной немедленной отправки данных в очереди Nagle
Это прекрасно работает для меня под Windows, MacOS/X и Linux. (Обратите внимание, что в Linux окончательный нулевой байт send() не требуется)
Там нет эквивалента. Лучшее, что вы можете сделать, это сначала собрать ваши данные в ваш собственный буфер, а затем отправить готовый буфер в сокет, когда будете готовы, и позволить Nagle нормально обрабатывать пакеты.