如下传参数
TOSICMP = 0x2;
result = setsockopt(pingSessions[iIndex].pingSockFd, IPPROTO_IP, IP_TOS, (char*)&TOSICMP, sizeof(TOSICMP));
按上面设置返回正确,但抓包发现 设置的TOSICMP值没起作用。
TOSICMP = 0x3;
result = setsockopt(pingSessions[iIndex].pingSockFd, IPPROTO_ICMP, IP_TOS, (char*)&TOSICMP, sizeof(TOSICMP));
result = setsockopt(pingSessions[iIndex].pingSockFd, IPPROTO_RAW, IP_TOS, (char*)&TOSICMP, sizeof(TOSICMP));
按上面这两种设置返回错误。

解决方案 »

  1.   

    应该是第一种写法:
    TOSICMP = 0x2;
    result = setsockopt(pingSessions[iIndex].pingSockFd, IPPROTO_IP, IP_TOS, (char*)&TOSICMP, sizeof(TOSICMP));没有用过该功能
      

  2.   

    兄弟,当错我是自己写的IP头和ICMP头
      

  3.   

    谢谢!
    但是抓包发现IP层的TOS没有起作用还是 0;
    如果是udp包就tos值就改过来了
      

  4.   

    to windcsn(向所有的朋友学习!) 我觉得只修改tos字段,不需要自己构造 ip头,应该直接设置socket(原始)就可以了啊
    icmp 头我自己构造...
      

  5.   

    我也遇到同样问题,不知道什么原因,我用的socketRaw和普通socket都试过不行,UDP的我也设置过同样抓到的包TOS没有修改,不知道你解决没有,实在不行只能自己构造包头了。
      

  6.   

    我今天试了一下,自己构造的IP头,发现只要设置了TOS域不为0,系统自动把TOS域置为0,并且重新计算了IP头校验和(通过sniffer截包发现),不知道有什么解决办法?参考下文:http://www.xfocus.net/articles/200202/343.html
      

  7.   

    to zcy_beijing(行云流水)
    udp 好象没有问题,就是raw socket 好象有问题
      

  8.   

    to ljp940531(ljp) :
    在我这儿UDP也有问题,很奇怪,后来查找MS的帮助说现在已经不支持直接设置TOS域,要用GQOS API来设置,可是也没有具体例子。在MS的网站山查找了半天,给的例子好像不是我想要的。ICMP包的IP头都是我自己构造的系统都给我改掉了。
      

  9.   

    to zcy_beijing(行云流水) 
     哦,其实我是在vXworks下试的,vXworks UDP的socket行,而icmp的raw  socket就不行 所以我就到windows下试了一下icmp的 raw socket也不行,  至于windows的udp的我没试过可能存在协议栈支持不支持的问题,奇怪是windows应该支持啊
    windows自带ping 也有TOS 设置,可惜设置后ping 包出去 抓包发现TOS 字段还是0
    不想windows还有这种bug?还是骗人的? 
    你可以试一试windows ping 功能
      

  10.   

    to ljp940531(ljp) :
       windows ping的TOS我早试过确实不行,不过可能是因为现在windows系统加入的QoS支持导致它不能直接设置了。