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