【发布时间】:2017-01-31 22:35:16
【问题描述】:
我一直在阅读有关 TCP 数据包以及它们在航行期间如何多次拆分的信息。我假设我必须在用于实际网络流量的缓冲区的顶部实现某种缓冲区,以便存储每个ReceiveAsync(),直到有足够的数据可用于解析消息。顺便说一句,我正在通过 TCP 发送长度前缀、protobuf 序列化的消息。
然后我读到较低层(以太网?IP?)实际上会透明地重新组装数据包。
我的问题是,在 C# 中,我能保证通过 TCP 接收完整的“消息”吗?换句话说,如果我发送 32 个字节,我是否一定会在“一次性”中收到这 32 个字节(一次调用ReceiveAsync())?还是我必须“存储”每次接收,直到接收到的字节数等于长度前缀?
另外,我能否在一次调用 ReceiveAsync() 时收到更多条消息?说一个“protobuf 消息”是 32 个字节。我送了2个。我是否可以“一次性”接收 48 个字节,然后再接收 16 个字节?
我知道这个问题在谷歌上很容易出现,但我永远无法判断它是否在正确的上下文中(谈论实际的 TCP 协议,或者 C# 如何将网络流量暴露给程序员)。
谢谢。
【问题讨论】:
-
虽然 TCP 数据在传输过程中可以被拆分并采用不同的路由,但可以说这对应用程序是 100% 透明的。您需要做的就是安全地接收它,因为它是为您重新组装的。这不是 UDP 的情况
-
@MickyD 虽然您的陈述是正确的,但我认为您错过了问题的重点。他询问的是应用程序在任何给定时刻可用的数据量。
-
@JonathonReinhart 这就是为什么这是评论而不是答案
标签: c# sockets networking tcp