c++winsock-recv()返回不正确且奇怪的缓冲区



我正在写一个名为"TicTacToe"的简单游戏。我还想用WinSock创建一个网络函数。虽然两个用户之间的连接没有错误,但我无法接收到任何正确的数据。收到后,缓冲区中会填充一个奇怪的字符,如"☺$0/A"等,而它应该收到"你好!".

这是我的代码:

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] = '';
cout << rbuf << endl;

首先,您没有检查send/recv调用的return值,也不能期望它总是接收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的电话,但我只想让你有一个大致的想法


希望能有所帮助,使用一点指针算术,但不要使用太广泛的


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

最新更新