TCP套接字是否以与发送时相同的方式接收数据?

时间:2014-11-29 15:07:50

标签: c sockets tcp

如果TCP客户端发送如下数据块:

CHUNK1: 50 bytes of data
CHUNK2: 10 bytes of data
CHUNK3: 20 bytes of data
CHUNK4: 30 bytes of data
CHUNK5: 40 bytes of data

然后TCP服务器将以相同的方式接收数据:

CHUNK1: 50 bytes of data
CHUNK2: 10 bytes of data
CHUNK3: 20 bytes of data
CHUNK4: 30 bytes of data
CHUNK5: 40 bytes of data

或者它可能会像这样到达:

CHUNK1: 80 bytes of data
CHUNK2: 30 bytes of data
CHUNK3: 40 bytes of data

我之所以要问的原因是因为每个块都是一个包含一些信令和数据有效负载的自包含消息(在客户端)。所以我想知道我是否必须在服务器端解析数据流(如果数据没有以与发送时相同的方式到达)来重建服务器端的消息。

2 个答案:

答案 0 :(得分:1)

TCP是面向流的协议。 "消息边界"不保留。标准不知道消息是什么。

搜索" TCP消息框架"找到你需要的东西。

答案 1 :(得分:1)

recvsend网络呼叫可能返回的发送/接收字节数少于指定的字节数。您可能希望拥有这样的函数,该函数接收到指定数量的字节。

#include <sys/types.h>
#include <sys/socket.h>

int readall(int s, char *buf, int *len)
{
    int total = 0;        // how many bytes we've read
    int bytesleft = *len; // how many we have left to read
    int n = -1;

    while(total < *len) {
        n = read(s, buf+total, bytesleft, 0);
        if (n <= 0)  { break; }  
        total += n;
        bytesleft -= n;
    }

    *len = total; // return number actually read here

    return (n<=0)?-1:0; // return -1 on failure, 0 on success
} 

您也可以编写类似的sendall函数。然后使用sendall发送指定消息长度的前两个字节,例如,然后sendall消息。你在接收方做同样的事情,首先是readall消息长度,然后是消息。