2012-03-29 57 views
0

我正在使用C++编写TCP客户端服务器应用程序。现在第三方lib在此项目中被允许。在recv()api中填充的数据

这里的客户端服务器之间交换使用需要以及format.once客户端接收数据包定义协议,它将发送它parsing.I具有将于解析活动的护理方案经理。

我有以下疑问 当数据从网络到达客户端时,OS将其缓存直到应用程序调用recv()函数。

所以两个消息MSG1和MSG2到达缓冲区的recv的调用将返回MSG 1 + MSG2。现在这可能导致解析活动失败。

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

回答

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); 
0

在TCP中,你看不到数据包的边界,所以如果你打电话给recv()前两个数据包到达,你将在一个去拿两个数据包的内容。

在UDP,数据包边界已被保留,所以每次调用recv()还给一个数据包。

+0

正如我们在TCP的工作,PLZ给我们的解决方案,以发现我们是包的数量接收使用recv()API。同样,客户端总是会得到完整的响应,或者有可能获得一半的响应,另一半则保持另一种类型(例如:取决于我们为recv()API定义的缓冲区) – Revathy 2012-03-29 07:53:14

+0

完全可以给半个数据包--TCP假定您想要传输单个数据流。该数据的任何结构都需要来自协议(记录结构,长度字段或转义字符)。你在执行什么协议? – 2012-03-29 08:11:31

+0

TCP/IP协议 – Revathy 2012-03-29 10:06:15