Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我通过tcp发送一个数据包时,它被分成两个数据包_C#_Tcp_Packets_Mtu - Fatal编程技术网

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

C# 当我通过tcp发送一个数据包时,它被分成两个数据包,c#,tcp,packets,mtu,C#,Tcp,Packets,Mtu,我正在用C#开发一个应用程序,使用服务器-客户机模型,其中服务器向客户机发送一个带有位图的字节数组,客户机将其加载到屏幕中,向服务器发送“OK”,服务器发送另一个图像,依此类推 图像缓冲区的长度是独立的,通常在60kb到90kb之间,但我发现这并不重要。如果我将客户机和服务器放在同一台计算机上,使用localhost,一切正常。服务器执行beginSend,客户端执行endReceive,并传输整个缓冲区 然而,我现在正在无线网络中测试这一点,结果是: 服务器发送图像 调用了在客户端上接收的回

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

图像缓冲区的长度是独立的,通常在60kb到90kb之间,但我发现这并不重要。如果我将客户机和服务器放在同一台计算机上,使用localhost,一切正常。服务器执行beginSend,客户端执行endReceive,并传输整个缓冲区

然而,我现在正在无线网络中测试这一点,结果是:

  • 服务器发送图像
  • 调用了在客户端上接收的回调函数data_,但只需读取1460字节(MTU-为什么?不应该只在UDP中?)
  • 再次调用客户端上接收的回调函数data_,现在调用剩余的缓冲区(1000字节或100 KB)
总是这样的,第一个数据包接收到1460字节,然后第二个数据包包含其余的数据包

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

不管怎样,任何帮助都会很好

干杯

这是TCP-您应该将数据视为流。您不应该关心流是如何分解成数据包的,也不应该对其进行假设

如果您需要接收单个“数据块”,可靠地做到这一点的最简单方法是使用长度作为前缀(例如,作为32位值)。您读取长度(注意,即使这些字节也可能被拆分为多个数据包),然后重复读取(同步或异步),记录每次读取的数据量,直到您读取了所有数据

读读

在剖析应用层协议时,不能假设每个TCP数据包只包含一条应用层消息。一个应用层消息可以拆分为多个TCP数据包


约翰的回答补充道:

int offset = 0;
int imagesize = 512;
byte[] buffer = new byte[512];

tcpChannel.Read(buffer, offset, imagesize);

TCP不是这样工作的:即使TCP提供了基本的错误检查,添加一种方法来验证接收到的数据(CRC、SHAMD5)也是一个好主意。查看以了解更多信息。