recv()api中的填充数据

时间:2012-03-29 06:38:25

标签: windows sockets visual-c++ tcp udp

我正在使用c ++开发TCP客户端服务器应用程序。现在允许在这个项目中使用第三方库。

此处客户端服务器之间的交换使用良好定义的协议格式。客户端接收它将发送它用于解析的数据包。我有协议管理器,它将负责解析活动。

我有疑问 当数据从网络到达客户端时,操作系统会将其缓冲,直到应用程序调用recv()函数。

因此,两个消息msg1和msg2到达缓冲区,对recv的调用将返回msg1 + msg2。现在这可能导致解析活动失败。

我的疑问 1.上述假设是否正确? 2.如果上述提议是正确的,那么如何解决这个问题。

2 个答案:

答案 0 :(得分:0)

在TCP中,您无法看到数据包边界,因此如果两个数据包在您致电recv()之前到达,您将一次性获得两个数据包的内容。

在UDP中,数据包边界被保留,因此每次调用recv()都会返回一个数据包。

答案 1 :(得分:0)

Revathy,

这里需要做的是制作固定长度的数据包或至少固定长度的数据包,然后是可变长度数据。

标头应包含数据包的大小。所以在recv函数中,你总是读取头字节并解码数据包的大小,并使用另一个recv调用读取数据包的其余部分。

这样即使您的TCP层缓冲任意数量的数据包,您也可以正确读取它

    unsigned char* pBuffer = NULL;
    pBuffer = new unsigned char[MESSAGE_HEADER_LENGTH];

    // reading header from socket
    int nRet = recv(sock,(char*)pBuffer,MESSAGE_HEADER_LENGTH,0);
    int nDataLen = //Read the packet length from pBuffer
    // reading body from socket

    unsigned char* pPacket = NULL;
    pPacket= new unsigned char[nDataLen ];
    nRet = recv(sock,(char*)pPacket ,nDataLen ,0 );