大家好:
      头一次接触socket编程。
      现在已经有一个C++语言编写的socket程序,负责接收服务器发来的数据并转发到连接的多个客户端上。
      用的都是简单的socket API编写的。
      现在需要我来写一个这个数据接收和转发过程的丢包率检测程序,就是看看这个过程中有没有数据的遗漏。
      socket的建立过程中采用的已经是TCP方式发送和接收数据了。
      请大家给给思路。怎么去测试这个过程的丢包率。

解决方案 »

  1.   

    TCP是不可能丢包的,发送丢包,发送端是知道的。
    如果实在要测试,那就发送一个大文件,然后接收端接收到后存为文件,最后比较一下两个文件的不同处即可。
      

  2.   

      
    你好:谢谢关注.
        程序中得到数据后只是简单的调用了send函数,获得数据的时候也是简单调用接收函数,并没有直接接触包的概念,包的划分等应该是TCP协议自己进行的。这种情况下怎么测试丢包率呢?虽然说TCP不会丢包,其实这里是测试我发送的数据是否完全被接收!怎么知道发送端发送的时候有没有被接收端全部接收呢?这里的丢包率率其实不准确,应该是数据传输准确率。
      

  3.   


    socket定义的时候就是采用TCP协议的,虽说不会丢包,但是需要保证传输的数据没有遗漏的被接收端接收。这里可能不是丢包的问题。可能是程序处理数据中间造成的数据遗漏等情况。
    你说的方法也行,但是需要人工去对比了。有没有简单一点的针对我说的这种情况的,在程序中就处理计算下发送的数据是否完全被接收?
      

  4.   


    “TCP是不可能丢包的”前提是失败重发,仅仅依靠TCP协议保证数据包的完整性也不是百分之百可靠,因为IPV4下,TCP是靠16位加和校验来进行错误检测的。要想验证丢包率,建议你使用UDP这种无连接的方式,因为TCP的握手、连接确认、接收确认等报文都会引起额外的网络负荷。发送端发送带索引的报文,失败不重发,接收端依据索引判断是否丢包。
      

  5.   

    如果数据不大的话可以定义一个结构体:
    struct DATAPACK
    {
      int  nIndex;
      char pData[1024];
    };
    发送端发送DATAPACK *并填充nIndex,接收端检验nIndex就可以了!!
      

  6.   

    TCP,你只需要保证接收完整就好了,传输过程底层已经做了丢包重传机制,不需要你自己做
    发送接收要有自己的协议,每个包加上自己的包长,来保证接收完全
      

  7.   

         最终目的是保证低丢包率,途径就是测试当前程序的丢包率,如果还ok,那就ok了。交差。如果不行,就需要修改了。
      

  8.   


    用TCP的方式,错误重发,保证不了?
      

  9.   

    你好:
        程序中只是用到了简单的socket api,根本就没有接触到包的概念,数据的发送接受都是通过一个缓冲区获取数据的。请问你说的给包加包长怎么实现呢?我需要不停的发送很多条数据,一条数据是一条字符串的形式出现的。这里是不是一条数据就是一个包?
      

  10.   

    楼主的意思是,想要知道TCP连接,尽管连接上,想知道有没有在过程中丢包重传
    上层可以用socket的tcp解决
    下层用winpcap的统计模式+正则表达式解决
      

  11.   

    流程:基站<->中转<->客户端
    协议:TCP
    实现方式:中转为TCP SERVER,接收来自基站和客户端的数据,并将数据转发至另一方。
    验证方式:基站发起发送,数据格式内包含一个字节的索引值(起始值为0)和256个字节(依次0X00~0XFF),发送至中转后,立即转发至客户端,客户端收到后,验证包格式无误后,将索引值增加,并连带256个字节(从索引值开始,依次累加)发送至中转往复测试另外,你这个实际测的是你的中转的稳定性和在测试环境下的性能指标而已。
      

  12.   

    对tcp测试丢包率没必要,况且丢包率跟网络环境有关,检查下数据接收的完整性,以及解包的合理性
      

  13.   


       我现在就只能做检查数据的完整性这步了。至于涉及包的东西,不管是在包头加信息,还是什么解包,程序都没有涉及,我也不会。
      就先这样吧。我就在接受端对比一下和发送端的数据总量是不是一样就好了。
      至于包的问题,以后再慢慢研究了。这个程序没有丝毫的设计到包,数据的发送和接受时直接用seng和recv函数的,以字符串的形式发送接受,包的处理都是协议自己进行的。
    谢谢大家,结贴