我是开发一个应用程序中,使用服务器-客户型,那里的服务器发送一个字节列有一位客户、客户将其加载到屏幕上,发送"确定"服务器和服务器发送的另一个图像,等等。

图像的长度缓冲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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top