Home > Back-end >  winsock printing too much
winsock printing too much

Time:01-30

I wanted to try a server/client connection kind of thing, and so I modified the code from a YouTube tutorial (New to C ). So far everything works just fine, except when I try to print the message that was sent by the client.

The code used for sending and receiving data is the following:

char buf[4096];

while (true)
{
    ZeroMemory(buf, 4096);

    int bytesReceived = recv(clientSocket, buf, 4096, 0);
    if (bytesReceived == SOCKET_ERROR)
    {
        cerr << "Error in recv()! Quitting" << endl;
        break;
    }

    if (bytesReceived == 0)
    {
        cout << "Client disconnected!" << endl;
        break;
    }

    cout << buf << endl;
    send(clientSocket, buf, bytesReceived   1, 0);
}

Sending it back works fine, as well a printing it to the console. However, in the console it prints a crazy amount of new lines after the initial output. I guess it has something to do with the size of the buf, which is 4096, but I don't know how to fix it.

CodePudding user response:

recv() tells you how many bytes were actually put into your buf, but you are ignoring that value when printing the contents of buf. The operator<< you are using expects a null-terminated string, but recv() does not guarantee your buf is null-terminated (even if the client sends a null terminator, it may not have arrived yet when recv() exits).

Use write() instead of operator<< when printing buf to std::cout, so that you can specify bytesReceived as the size to print.

You are also sending 1 more byte back to the client then you actually received. You should not be adding 1 to bytesReceived when calling send().

You also need to take into account that send() may accept fewer bytes for transmission than you ask for, so it needs to be called in a loop, just like with recv().

Try this instead:

char buf[4096], *ptr;
int bytesReceived, bytesSent, errCode;

while (true)
{
    bytesReceived = recv(clientSocket, buf, sizeof(buf), 0);
    if (bytesReceived == SOCKET_ERROR)
    {
        errCode = WSAGetLastError();
        cerr << "Error " << errCode << " in recv()! Quitting" << endl;
        break;
    }

    if (bytesReceived == 0)
    {
        cout << "Client disconnected!" << endl;
        break;
    }

    cout.write(buf, bytesReceived);
    //cout << endl;

    ptr = buf;
    while (bytesReceived > 0)
    {
        bytesSent = send(clientSocket, ptr, bytesReceived, 0);
        if (bytesSent == SOCKET_ERROR)
        {
            errCode = WSAGetLastError();
            cerr << "Error " << errCode << " in send()! Quitting" << endl;
            break;
        }
        ptr  = byteSent;
        bytesReceived -= byteSent;
   }

   if (bytesReceived > 0)
       break;
}
  •  Tags:  
  • Related