当我派一个分组over tcp,它被分裂成两个分组
题
我是开发一个应用程序中,使用服务器-客户型,那里的服务器发送一个字节列有一位客户、客户将其加载到屏幕上,发送"确定"服务器和服务器发送的另一个图像,等等。
图像的长度缓冲deppends,通常是间60kb和90kb,但我已经看到,它并不重要。如果我把客户和服务在相同的计算机,使用"localhost",一切正常。服务器没beginSend和客户并用endreceive和整个缓冲器传送。
然而,我现在测试这在一个无线网络和会发生什么情况是:
- 服务器发送的图像。
- 回呼功能data_received上的客户是所谓,但是只有1460字读取(的-为什么?不应该只能在UDP?)
- 回呼功能data_received上的客户是再次呼吁,现在与缓冲区(要么是1000字节或100kb)...
它总是这样的,第一分组的带1460字节是收到的,然后第二组包含的其余部分。
我可以通过加入这两个字节的数组收到,但这似乎不正确的。我甚至不知道为什么会发生这种情况。它是一些限制的网络?那么,为什么不C#等待整个数据被传送的?我的意思是,这是TCP,我不应该担心它,对吗?
无论如何,任何的帮助将是伟大的!
欢呼
解决方案
这是TCP-你应该享数据为 流.你不该关心的是如何流是破碎成数据包,或作出假设。
如果你需要接受一个单一的"区块"的数据,最简单的方式做到这一可靠的是以前缀它的长度(例如作为一个32位数值)。你读的长度(注意到,即使是那些字节 可能 被分割在多个分组),然后反复读(是否同步或异步)注意到你有多么阅读每一次,直到你读过所有的数据。
其他提示
有一个读的 9.2.4
在解剖一个应用程序层协议不能假设每个TCP分组包含一个应用程序层的消息。一个应用程序层消息可以分成几个TCP分组。
添加到约翰的回答:
int offset = 0;
int imagesize = 512;
byte[] buffer = new byte[512];
tcpChannel.Read(buffer, offset, imagesize);
不隶属于 StackOverflow