c# - 当我通过 tcp 发送一个数据包时,它被分成两个数据包

标签 c# tcp packets mtu

我正在用 C# 开发一个应用程序,使用服务器-客户端模型,其中服务器向客户端发送一个带有位图的字节数组,客户端将其加载到屏幕上,向服务器发送一个“OK”,然后服务器发送另一张图片,依此类推。

图像缓冲区的长度视情况而定,通常在 60kb 到 90kb 之间,但我看到这无关紧要。如果我将客户端和服务器放在同一台计算机上,使用本地主机,一切正常。服务器执行 beginSend,客户端执行 endReceive 并传输整个缓冲区。

但是,我现在正在无线网络中对此进行测试,结果是:

  • 服务器发送图片。
  • 调用了客户端的回调函数data_received,但只有1460字节需要读取(MTU - 为什么?不应该只在UDP中?)
  • 再次调用客户端上的回调函数 data_received,现在使用缓冲区的其余部分(1000 字节或 100 KB)...

总是这样,收到第一个 1460 字节的数据包,然后第二个数据包包含其余部分。

我可以通过连接接收到的两个字节数组来解决这个问题,但这似乎不对。我什至不确定为什么会这样。是对网络的一些限制吗?那么为什么 C# 不等待整个数据被传输呢?我的意思是,它是 TCP,我不必担心它,对吧?

无论如何,任何帮助都会很棒!
干杯

最佳答案

这是 TCP - 您应该将数据视为。您不应该关心流是如何分解成数据包的,或者对此做出假设。

如果您需要接收单个数据“ block ”,最简单可靠的方法是在其前面加上长度(例如,作为 32 位值)。您读取长度(注意即使是那些字节也可能被分成多个数据包)然后重复读取(无论是同步还是异步)并记下您每次读取了多少,直到您读取所有数据。

关于c# - 当我通过 tcp 发送一个数据包时,它被分成两个数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/769045/

相关文章:

c# - 尝试通过 TCP 传输 2 路音频?

java - 数据输入 : Bytes lost over TCP

c# - 对象列表中的不同值

c# - 可以使用break进行外循环吗?

c# - 锁定的 console.writeline 调用工作不正常

使用 netfilter 队列修改数据包?

Python UDP 数据包永远不会到达

c# - 我可以在 C# 中声明带有千位分隔符的常量整数吗?

Python/Twisted - TCP 数据包碎片?

c++ - 网络数据打包