cni*_*tar 15
你不能.TCP不适用于数据包/消息等.TCP使用字节.你得到一个字节流.问题是,无法保证每次从套接字读取时都会得到的字节数.处理这个的常用方法:
你的信息可能是:
|Message Length:4bytes|Additional header Information:whatever1|Message Data:whatever2|
Run Code Online (Sandbox Code Playgroud)
那么你要做的就是读取4个字节,然后读取尽可能多的4个字节告诉你.然后,您将能够剥离标题并获取数据.
正如其他人所提到的,TCP 是一种流协议。这意味着从 API 的角度来看,没有“数据包”的概念。作为用户,您所能期待的只是数据流。
在内部,TCP 会将流分成可以放入 IP 数据包的段。这些数据包将与控制数据一起通过 IP 发送到远程端。远端将接收这些 IP 数据包。它可能会丢弃某些 IP 数据包(在重复的情况下)、重新排序数据包或保留数据,直到更早的数据包到达。所有这些都是 TCP 内部的,这意味着“TCP 数据包”的概念毫无意义。
您也许可以使用原始套接字来接收原始 IP 数据包,但这意味着您必须重新实现大部分 TCP 堆栈(例如发送 ACK 和调整窗口大小)才能使远程端正确执行。你不想这样做。
另一方面,UDP 是一种数据报协议。这意味着用户知道数据是如何通过网络发送的。如果数据包或数据报的概念对您很重要,您将需要在 UDP 之上构建自己的协议。