C# 当我通过tcp发送一个数据包时,它被分成两个数据包
我正在用C#开发一个应用程序,使用服务器-客户机模型,其中服务器向客户机发送一个带有位图的字节数组,客户机将其加载到屏幕中,向服务器发送“OK”,服务器发送另一个图像,依此类推 图像缓冲区的长度是独立的,通常在60kb到90kb之间,但我发现这并不重要。如果我将客户机和服务器放在同一台计算机上,使用localhost,一切正常。服务器执行beginSend,客户端执行endReceive,并传输整个缓冲区 然而,我现在正在无线网络中测试这一点,结果是:C# 当我通过tcp发送一个数据包时,它被分成两个数据包,c#,tcp,packets,mtu,C#,Tcp,Packets,Mtu,我正在用C#开发一个应用程序,使用服务器-客户机模型,其中服务器向客户机发送一个带有位图的字节数组,客户机将其加载到屏幕中,向服务器发送“OK”,服务器发送另一个图像,依此类推 图像缓冲区的长度是独立的,通常在60kb到90kb之间,但我发现这并不重要。如果我将客户机和服务器放在同一台计算机上,使用localhost,一切正常。服务器执行beginSend,客户端执行endReceive,并传输整个缓冲区 然而,我现在正在无线网络中测试这一点,结果是: 服务器发送图像 调用了在客户端上接收的回
- 服务器发送图像
- 调用了在客户端上接收的回调函数data_,但只需读取1460字节(MTU-为什么?不应该只在UDP中?)
- 再次调用客户端上接收的回调函数data_,现在调用剩余的缓冲区(1000字节或100 KB)
干杯这是TCP-您应该将数据视为流。您不应该关心流是如何分解成数据包的,也不应该对其进行假设 如果您需要接收单个“数据块”,可靠地做到这一点的最简单方法是使用长度作为前缀(例如,作为32位值)。您读取长度(注意,即使这些字节也可能被拆分为多个数据包),然后重复读取(同步或异步),记录每次读取的数据量,直到您读取了所有数据 读读 在剖析应用层协议时,不能假设每个TCP数据包只包含一条应用层消息。一个应用层消息可以拆分为多个TCP数据包
约翰的回答补充道:
int offset = 0;
int imagesize = 512;
byte[] buffer = new byte[512];
tcpChannel.Read(buffer, offset, imagesize);
TCP不是这样工作的:即使TCP提供了基本的错误检查,添加一种方法来验证接收到的数据(CRC、SHAMD5)也是一个好主意。查看以了解更多信息。