找到0x0000字节后返回recv

时间:2016-05-19 21:54:04

标签: c++ sockets recv msgpack

这是我的代码:

  • 客户

    Position pos(1.0,2.0,0.45);
    feedback feed(12, pos, 100);
    msgpack::sbuffer sbuf;
    msgpack::pack(sbuf, feed);          
    int test = write(tcp_client.sockfd, sbuf.data(),sizeof(sbuf));
    
  • 服务器:

    char* buffer = new char[41];
    int test = recv(TCP_server.newsockfd, buffer, 40, MSG_WAITALL );
    
    for (int i=0; i< sizeof(buffer); i++)
    std::cout << std::hex << (int)buffer[i] << " ";
    std::cout << std::endl;
    

对于代码的其他部分,建立连接并成功传输数据。

现在的问题是我得到了以下输出:

  • 客户:

    ffffff94 b c ffffff93 ffffffca 3f ffffff80 0 0 ffffffca 40 0 0 0 ffffffca 3e ffffffe6 66 66 64
    
  • 服务器:

    ffffff94 b c ffffff93 ffffffca 3f ffffff80 0
    

    在遇到第一个0x0000字符后,接收数据是否有任何原因停止?当我发送一个字符串时,一切正常,但不是在这种特定情况下。

对于记录,recv() doc并没有多大帮助......

1 个答案:

答案 0 :(得分:2)

当你调用recv时,你应该使用该函数返回的值来确定你应该处理的字节数。

相反,您使用sizeof(buffer)来确定循环的次数,这是不正确的。 bufferchar *sizeof(char *)通常为4或8,具体取决于32/64位。

所以这个:

for (int i=0; i< sizeof(buffer); i++)

应该是:

int test = recv(TCP_server.newsockfd, buffer, 40, MSG_WAITALL );
// assuming that test >= 0
for (int i=0; i < test; i++)