我正在写一个名为“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;
答案 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
。