c++winsockrecvpeek

recv() with MSG_PEEK shows full message but returns 'would block' normally


I have a non-blocking winsock socket that is recv'ing data in a loop.

I noticed that when connecting with, say, putty and a raw socket, sending messages works just fine. However, when interfacing with this particular client, the packets seem to not be triggering a successful, non-MSG_PEEK call to recv. I recall having a similar issue a few years back and it ended up having to end the packets in \r or something coming from the client, which isn't possible in this case since I cannot modify the client.

Wireshark shows the packets coming through just fine; my server program, however, isn't working quite right.

How would I fix this?

EDIT: Turning the buffer size down to, say, 8 resulted in a few successful calls to recv without MSG_PEEK.

Recv call:

iLen = recv(group->clpClients[cell]->_sock, // I normally call without MSG_PEEK
        group->clpClients[cell]->_cBuff, CAPS_CLIENT_BUFFER_SIZE, MSG_PEEK);
if(iLen != SOCKET_ERROR)
{
    ...

Socket is AF_INET, SOCK_STREAM and IPPROTO_TCP.


Solution

  • Use setsockopt to set TCP_NODELAY to TRUE.