ip组包。怎样确认组包完成。

千梦一生 2021-05-26 09:57:10
A-->偏移:0 包长:200
B-->偏移:25 包长:200
C-->偏移:50 包长:200
D-->偏移:75 包长:200
E-->偏移:100 包长:200
------------------------------------------------------------------------

组包自然是收到ABCDE然后按这个顺序组上即可。
但是接受顺序是不受保证的。

------------------------------------------------------------------------

所以大家觉得应该写成一个怎样的尽量高效的逻辑,来判断组包是否完成?
收到一个扔到一个队列中,然后根据片偏移排序?排完后计算 :
if(0*8+200 == 25*200)
if(25*8+200 == 50*200)
...
循环?
每收到一包都要这么干吗?效率怎么感觉会比较低?

感觉挺麻烦。

或者我在想,能不能:收到的n包排好序,第n+1包通过某种方式刚好插入到对的位置?
或者我又想,能不能:局部组包,本来分了40片。我可能先收到了{2,3,4}、{14,15}、{30,31,32}。那我先给他组成3片?这样会快一些吗?
...全文
2262 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
千梦一生 2021-05-27
  • 打赏
  • 举报
回复
引用 5 楼 山河君 的回复:
组包完成:自己传输的时候带上包头包尾包信息,再判断一下? 测试:断网,传输中断,中断重连,阻塞? 你看咋样
这个需求是说要针对本地数据包文件,全是ip帧。 但我自己抓出来的ip发现。几乎每一帧ip帧都是刚好【查资料说tcp已经在握手阶段已经协商好了MSS,相当于在发送端TCP层就把数据包分好了,不会超过MTU(1500)】。 我组包代码写完了测试时才发现几乎每一包MF都为0。 这应该怎么测试我写的IP分片重组代码段啊?
flying_music 2021-05-26
  • 打赏
  • 举报
回复
没研究过,参考TCP怎么做的??
千梦一生 2021-05-26
  • 打赏
  • 举报
回复
如何保证一段连续内存均被访问过一次?
山河君 2021-05-26
  • 打赏
  • 举报
回复
组包完成:自己传输的时候带上包头包尾包信息,再判断一下? 测试:断网,传输中断,中断重连,阻塞? 你看咋样
千梦一生 2021-05-26
  • 打赏
  • 举报
回复
写完了。反正写着写着就写完了。结果写完了,丫拿数据出来一看。 好家伙。发现、想起这TCP都给分好了。ip实际上几乎不用分片。 导致我写的关键重组部分的代码都没跑,也不知道有没有bug ----------------------------------------------------------------------- 大佬们,问另一个问题吧:我写的ip重组程序。拿什么来验证呢?
赵4老师 2021-05-26
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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