C++ c+;中套接字的未知编码的recv()字符串+;

C++ c+;中套接字的未知编码的recv()字符串+;,c++,string,sockets,unicode,recv,C++,String,Sockets,Unicode,Recv,我正在编写一段客户端代码,它将连接到服务器,并向服务器发送一个ID——“16字节字符串”,作为回报,它将返回相同的16字节字符串。我也可能收到来自这个服务器的不请自来的请求,告诉我它的ID,我也必须将同样的东西发送回给他 当我创建字符串并发送它时,它工作得很好,因为我能够完全解析我得到的回复并打印出来,而这正是我发送的内容。但是,对于主动请求部分,我无法读取发送给我的字符串 这是我代码的一部分 string my_send_string = "123" ; char my_send_bu

我正在编写一段客户端代码,它将连接到服务器,并向服务器发送一个ID——“16字节字符串”,作为回报,它将返回相同的16字节字符串。我也可能收到来自这个服务器的不请自来的请求,告诉我它的ID,我也必须将同样的东西发送回给他

当我创建字符串并发送它时,它工作得很好,因为我能够完全解析我得到的回复并打印出来,而这正是我发送的内容。但是,对于主动请求部分,我无法读取发送给我的字符串

这是我代码的一部分

 string my_send_string  = "123" ; 
 char my_send_buffer[16] ; 
 char my_reply[256] ; 
 memset(my_send_buffer,'\0', 16) ; 
 strncpy(my_send_buffer,my_send_string.c_str(),my_send_string.size()) ;
 numBytes = send(sock_fd,my_send_buffer,16,0); 
 // verified that numBytes is indeed 16 .. 
 numBytes = recv(sock_fd, my_reply, 16, 0) ; 
 // verified that numBytes recvd is indeed 16 .. 
 printf("Original Send Reply: %s\n",my_reply ); // This prints 123, as I expect. 
 memset(my_reply,'\0', 16) ; 
 numBytes = recv(sock_fd, my_reply, 16, 0) ; 
 // verified that numBytes is 16. 
 printf("Unsolicited Request:%s\n",my_reply ); // This prints ?a?p??˝س?8?

 ....

我想我在这里对接收到的字符串进行了错误编码-有没有关于如何修复此问题的提示?在上面的示例中,我尝试只发送一次,但是如果我使用不同的字符串ID发送字符串10次,我总是会返回我发送的ID,因此这不是一次性的事情

这显示了连接的客户端。什么函数实际发送到连接的这一侧?我会检查发送的数据。这是为了分配-我已要求维护服务器端代码的TA澄清他用于发送回的编码。如果未经请求的消息在前16个字节中不包含任何
'\0'
,您的接收缓冲区中将有一个未终止的字符串,
printf
使用
%s
对其进行加密将是一个坏主意。尝试在16个字节上循环,并将它们分别打印为
%02x
。此外,您还可以使用wireshark之类的网络诊断工具,对发送给您的内容获取第二意见。如果您的平台有任何类似于
strace
的工具,请使用该工具查看
send
recv
s.@WumpusQ.Wumbley:更糟糕的是,他在第5行中写的
\0
超过了数组的末尾,假设
我的send\u字符串
确实是假定的16字节长(而不是代码中的情况)@TimHortons:除了写数组结束和nul终止问题(为什么不声明
char my_send_buffer[17]={};
为安全起见?),以及复制字符串非常不常用之外,我没有发现任何错误,而且它似乎也能工作。你确实得到了你的“123”,而主动请求,你得到了其他东西。想必,服务器的ID实际上是一个乱码,为什么不呢?它不需要只有十进制数字的ID,是吗?按照Wumpus Q.Wumbley的建议,使用
%02x
逐字节打印(二进制)ID。