I have an implementation of an HTTP server in C#. Using ab I discovered a weird performance issue. Each request took 5 ms with Keep-Alive Off but 40 ms w
I tested this with Wireshark. Unfortunately,
socket.NoDelay = true;
socket.NoDelay = false;
has no effect. Similarly,
socket.NoDelay = true;
socket.Send(new byte[0]);
socket.NoDelay = false;
also has no effect. From observed behaviour, it appears that the NoDelay property only affects the next call to Send with a non-empty buffer. In other words, you have to send some actual data before NoDelay will have any effect.
Therefore, I conclude that there is no way to explicitly flush the socket if you don’t want to send any extra data.
However, since you are writing an HTTP server, you may be able to use a few tricks:
Transfer-Encoding: chunked, you can send the end-of-stream marker (the "\r\n0\r\n\r\n") with NoDelay = true.NoDelay = true just before sending the last chunk.Content-Encoding: gzip, you can set NoDelay = true just before closing the gzip stream; the gzip stream will send some last bits before actually finishing and closing.I’m certainly going to add the above to my HTTP server now :)