c ++ winsock - recv()返回错误和奇怪的缓冲区

时间:2014-02-28 21:27:02

标签: c++ sockets buffer winsock recv

我正在写一个名为“TicTacToe”的简单游戏。我还想使用WinSock创建一个网络功能。虽然两个用户之间的连接没有错误,但我无法接收任何正确的数据。收到后,缓冲区中会填充一些奇怪的字符,如“☺$ 0 / A”等,同时收到“Hello!”。

这是我的代码:

const char buf[] = "Hello!";
char rbuf[16];
int bytes = 0;
memset(buf, 0, sizeof(buf));

// sending

send(sox, buf, sizeof(buf), 0);

// recv

bytes = recv(sox, rbuf, 16, 0)
rbuf[bytes] = '\0';
cout << rbuf << endl;

1 个答案:

答案 0 :(得分:1)

嗯,首先,您没有检查return / send次调用的recv值,也不能指望它始终接收16个字节。为了确保您获得想要收到的内容,您可能需要多次致电recv。以下是该问题的示例解决方案:

int FixedRecv(SOCKET sox, char* rbuf, int length)
{
    int ref, len = 0;
    do {
        ref = recv(sox, rbuf + len, length - len, 0);

        if(ref == 0) return 0;

        if(SOCKET_ERROR != ref)
            len += ref;
        else return SOCKET_ERROR;
    } while(len < length);

    return len;
}

同样适用于您对send的来电,但我只是想让您大致了解一下。


希望有所帮助,使用一点指针算法,但没有什么 太广泛了。

此外,如果您使用的是非阻塞套接字,则需要使用WSAEWOULDBLOCK检查WSAGetLastError