我正在做一个用POP3接收邮件的模块,在和服务器建立连接和发送收信指令后,
服务器将邮件分包发送过来,程序负责对所有的包进行组包以还原整封邮件,
当邮件很小或网络很畅通时邮件完整无缺,当接收大邮件(几M)时则邮件会被
损坏,比较明显的现象是有邮件附件是BMP位图时,预览位图可以看到位图已被
损坏,用UltraEdit比较 正常的位图和被损坏的位图,发现被损坏的位图比正
常的位图多了一些数据块,证明不是网络丢包而是收到了重复的包,哪么如何准确地
排除掉重复的包呢?我已经做了如下操作,有一定效果,但在网络比较忙时组包后还是有一些重复的包:1、保存每个包的序列号,当下个包来时如果序列号已存在则丢弃该包
2、保存每个包的(序列号+长度)的一个数值,如果下个包的序列号在这个区间则丢弃该包
3、对所有的包排序,以序列号升序排列
请教各位高手!另一帖在 http://community.csdn.net/Expert/topic/3166/3166113.xml?temp=4.340762E-02

解决方案 »

  1.   

    自己手动维护一个序号,按包拆分的编号都行
    所有的包有一个共同的ID表明是本次发送的数据
    在拆包前先发送包的数目(跟序号对应),每收到一个包将这个序号做标记,下次收到就丢弃
    我以前写socket就是这么做的,没出现什么问题
    仅供你参考,具体细节我也忘了,一年半都没写这种程序了
      

  2.   

    啊,忘了说,我做的是比较低层的(NDIS中间层)的组包情况,不是应用层,所有没有经过协议栈处理包,现在就是要自已写处理包的程序,有做过这方面的吗?
      

  3.   

    本帖的另一帖在 http://community.csdn.net/Expert/topic/3176/3176205.xml?temp=.2331507如果能解决,除这两帖的分外,另开帖再给分都可
      

  4.   

    TO BLsoft(网龙) :我做的是POP3接收邮件的模块呀:),自已发自已收有啥意思:)
      

  5.   

    to xtky_limi(窗外细雨):你以为是WINDOWS窗口吗,搞笑是指TCP缓冲/窗口大小
      

  6.   

    TO kwiner(ak.net):你的意思是客户端不是你一手设计的.原来是共用的.
      

  7.   

    呵呵呵,楼主对待学术的严谨态度真的很感人,
    其实那个帖子我说的那个方法已经能保证99%的正确性了呵呵可惜很多网络版的高手都不来了,要不问问他们或许能有个结果-_-#TO BLsoft(网龙)
       
         楼主说的是类似sniffer的东西,监听到的都是最原始的数据包,然后把与pop3有关的数据包重组起来合成一个mail的
      

  8.   

    TO:PiggyXP 啊.原来是这种东东.是不是想做黑客软件.黑别人程序呀.怪不得要分了一定要100%的装起来