如何处理多部分网络数据块?

时间:2014-12-19 12:26:28

标签: sockets network-programming network-protocols epoll

我正在使用TCP为给定协议编写网络客户端,并且我对该事物的整体架构存在一些哲学问题。 有时可能会发生我没有完整的请求数据,我可能需要读取比目前可用的更多的字节,我想有时候我可以获得另一个请求的部分内容。一个我想要的。在这种情况下,通常的做法是什么?

1 个答案:

答案 0 :(得分:1)

TCP套接字是面向流的。这意味着读取它们与读取文件相同。如果要通过TCP传递离散消息,则需要将数据流拆分为消息,就像换行符将文本文件拆分为行一样。这称为框架。

有很多方法可以做到这一点,这里有一些例子:

  1. 计数方法 - 每条消息都以其长度为前缀。说“5apple”。您首先读取“5”,然后您知道此消息中有多少字节,并且第6个字节将是下一条消息的第一个字节。如果您的某些消息很长,则可能需要几个长度字节。

  2. 分隔符方法 - 有一个特殊字符(比如null)表示一条消息的结束和下一条消息的开始。然后只需从套接字读取,直到达到此分隔符。但请注意,您必须确保此字符永远不会出现在您的邮件中,因为这样会搞砸所有内容。

  3. 固定大小的消息 - 与第一种方法类似,只是长度字段是隐式的。确保所有消息都具有固定长度(如果需要,使用填充),然后每次只读取套接字中正确的字节数。