2014-02-28 68 views
0

我在写一个名为“TicTacToe”的简单游戏。我也想用WinSock创建一个网络功能。虽然两个用户之间的连接没有错误,但我无法收到任何正确的数据。收到缓冲区后,会填入“☺$ 0/A”等奇怪字符,同时收到“Hello!”。C++ winsock - recv()返回不正确和奇怪的缓冲区

这里是我的代码:

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

总是检查recv()的返回值是否有错误。 – Kelm

+0

请显示你的真实代码,这将不会编译 – 4pie0

+0

看起来,你是对的,因为它总是返回SOCKET_ERROR代码,谢谢你的领导!我稍后会查看详细信息。 – user3366592

回答

1

嗯,一个,你不检查你的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,但我只是想让你得到一个总体思路。


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

此外,如果您使用非阻塞套接字,则需要检查WSAEWOULDBLOCKWSAGetLastError