Я проверил это с Wireshark. К сожалению,
socket.NoDelay = true;
socket.NoDelay = false;
не имеет никакого эффекта. Аналогичным образом,
socket.NoDelay = true;
socket.Send(new byte[0]);
socket.NoDelay = false;
также не имеет никакого эффекта. Из наблюдаемого поведения видно, что свойство NoDelay
влияет только на следующий вызов Send
с непустым буфером. Другими словами, вам нужно отправить некоторые фактические данные, прежде чем NoDelay
окажет какое-либо влияние.
Поэтому я прихожу к выводу, что нет способа явно очистить сокет, если вы не хотите отправлять какие-либо дополнительные данные.
Однако, поскольку вы пишете HTTP-сервер, вы можете использовать несколько приемов:
- Для запросов, которые обслуживаются с помощью
Transfer-Encoding: chunked
, вы можете отправить маркер конца потока ("\r\n0\r\n\r\n"
) с помощью NoDelay = true
.
- Если вы обслуживаете файл из локальной файловой системы, вы будете знать, когда файл закончится, поэтому вы можете установить
NoDelay = true
непосредственно перед отправкой последнего фрагмента.
- Для запросов, которые обслуживаются с использованием
Content-Encoding: gzip
, вы можете установить NoDelay = true
непосредственно перед закрытием потока gzip; поток gzip отправит несколько последних битов перед фактическим завершением и закрытием.
Я, безусловно, добавлю вышеупомянутое на мой HTTP-сервер сейчас:)