我知道TCP提供类似流的数据传输,但主要问题是 - 通过TCP发送数据时会出现什么情况?
1.可以将消息拆分为N个块以适合MTU大小
2.在1次recv调用中可以读取两条消息。
有下一种情况吗?
MTU例如1500字节
客户端调用以1498字节数据发送
客户端调用以100字节数据发送
服务器调用recv并接收1500字节数据
服务器调用recv并接收98字节数据。
因此,当第一个服务器recv中将收到来自第二个客户端发送的2个字节时,它最终会出现这种情况。
我的协议定义为傻瓜:
4个字节 - 数据长度
数据内容。
我想知道当4个字节(数据长度)被分成2个块时我能想出什么情况吗?
答案 0 :(得分:7)
是的,可以在任何字节边界上拆分字节流。你当然可以用8种不同的方式分割你的4字节数据长度标题:
4
1-3
2-2
3-1
1-1-2
1-2-1
2-1-1
1-1-1-1
其中一些比其他人更容易发生,但你必须考虑到这些。可以处理此问题的代码可能如下所示:
unsigned char buf[4];
size_t len = 0;
while (len < sizeof(buf)) {
ssize_t n = recv(s, buf+len, sizeof(buf)-len, 0);
if (n < 0) {
// error handling here
}
len += n;
}
length = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
答案 1 :(得分:1)
我总是以一种期望数据碎片以某种方式的方式编写我的应用程序。一旦你想出一个好的设计,这并不难。
What's the best way to monitor a socket for new data and then process that data?