当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《当我通过tcp发送数据包时,它被分成两个数据包》经验,为你挑选了2个好方法。

我正在使用服务器 - 客户端模型在C#中开发应用程序,其中服务器将带有位图的字节数组发送到客户端,客户端将其加载到屏幕中,向服务器发送"OK",然后服务器发送另一个图像,等等.

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

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

服务器发送图像.

调用客户端上的回调函数data_received,但只读取1460个字节(MTU - 为什么?不应该只在UDP中?)

再次调用客户端上的回调函数data_received,现在使用缓冲区的其余部分(1000字节或100千字节)...

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

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

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



1> Jon Skeet..:

它是TCP - 您应该将数据视为.您不应该关心如何将流分解为数据包,或对流做出假设.

如果需要接收单个"块"数据,可靠的最简单方法是在其前面加上长度(例如,作为32位值).你读取长度(注意甚至那些字节可以分成多个数据包),然后重复读取(无论是同步还是异步)记录每次读取的数量,直到你读完所有数据.



2> ShuggyCoUk..:

阅读9.2.4

在剖析应用程序层协议时,您不能假设每个TCP数据包只包含一个应用程序层消息.一个应用层消息可以分成几个TCP数据包.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有