TCP 协议出现重复的包.

qlz37238 2015-02-27 09:44:55
这个是把发送端的桌面位图发送到接收端.然后接收端显示 显示在对话框上面.
用的是TCP协议.但是现在出现了一个问题就是在接收端接收到许多重复的包.
在发送与接收定义了自定义的结构 下面是伪代码

struct 包结构{
ULONG 数据长度;//是用来保存当前结构的数据的长度
BYTE 标记; //用来标记是不是最后的包
ULONG 偏移量; //这个包的偏移量
char 数据[2014];
}


发送端与接收端的缓冲区大小都是sizeof(包结构) 因为发送的数据比较大所以每次发送都是进行分段发送. 我在接收端new一个大小合适的内存(发送之前会有协商大小) 每次通过偏侈量对分配的内存进行定位然后写入数据长度那么多字节 .如果是标记的是最后一个包.那就在对话框显示发送端的桌面 我在接收端用的是IOCP. 现在就是如果发送端太快的接收端显示出来的桌面是很乱的.很花. 如果在发送端Sleep(20)的话.就显示正常.只不过这样的话太慢了每次显示. 我在接收端用TRACE显示接收到的偏移量值.结果看到有时候会输出几个连续一样的偏移量的值. 请教一下各位这种是什么问题造成的?
...全文
1628 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qlz37238 2015-04-29
  • 打赏
  • 举报
回复
问题解决了。重新定义了一下结构

struct 包结构{
    ULONG  源数据大小;//保存数据的实际大小
    ULONG  压缩大小;//保存数据压缩过后的大小
    BYTE      数据[1];//数据大小为BYTE[1]
}
每次都进行压缩然后发送。结构的大小不固定 结构里面的成员记录源大小与压缩过后的大小。主要是用来恢复发送过后的数据。这样改了过后。问题就解决了。谢谢各位
SiGoYi 2015-03-11
  • 打赏
  • 举报
回复
不用看代码,我可以肯定是楼主代码问题,TCP是不会发重复包的。好好查查你拆分包的代码逻辑吧!
foxavideo 2015-03-06
  • 打赏
  • 举报
回复
建议你在接收端,将接收到的所有数据放存在一个文件中与发送端的做一个比较,我之前做过一个例子, http://www.itye.org/archives/1178
蒙飞鸿 2015-02-28
  • 打赏
  • 举报
回复
...这个问题的复杂程度绝对需要你提供更多的字数来详细描述。。。比如伪代码什么的。
  • 打赏
  • 举报
回复
看看发送端的偏移量是否重复,不过如果只是重复,桌面也不会花才对。 你确认一下是否漏包吧。。
lougd 2015-02-28
  • 打赏
  • 举报
回复
用抓包工具看一下封包发送是否正确。
worldy 2015-02-28
  • 打赏
  • 举报
回复
估计是lz你自己的代码重复发送了,实际上大文件传输不需要你自己分块,TCP会自己划分为可以传输的块,windows在TCPIP扩展函数中,有一个叫TransmitFile的函数用于传输文件用
赵4老师 2015-02-28
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545 建议楼主学会使用抓包软件比如wireshark
oyljerry 2015-02-28
  • 打赏
  • 举报
回复
是不是发送的包偏移等计算有问题,多加点log日志等分析一下
xian_wwq 2015-02-28
  • 打赏
  • 举报
回复
先保证发送侧没有重复发包, 在调试通讯程序的时候,不要打断点跟踪, 将调试信息输出到日志文件中,根据日志文件来分析
Sandrer 2015-02-28
  • 打赏
  • 举报
回复
大数据传输一般都要收到反馈后再发下一个包的,不能一次过全部发出去! 不管你是不是用iocp

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧