• [转载] ACE 组播校验和出错问题解决


    源地址:http://yuanmuqiuyu2000.blog.sohu.com/140904942.html

    使用ACE框架写了个组播简单的测试工具,但是测试过程中,总是发现udp校验和出错的信息。代码如下:

    #include "ace/SOCK_Dgram_Mcast.h"
    #include "ace/Log_Msg.h"

    int main()
    {
            ACE_SOCK_Dgram_Mcast mcast;
            ACE_INET_Addr        srv_addr("224.0.0.9:520");

            if (mcast.open(srv_addr, "eth0", 1) == -1)
            {
                    ACE_ERROR_RETURN((LM_ERROR, "%p"), -1);
            }

            mcast.join(srv_addr);

            // 进行RIP2协议测试

            char peer0_2[] = {
    0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
    0xc0, 0xa8, 0x6f, 0x00, 0xff, 0xff, 0xff, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00,
    0xc0, 0xa8, 0x03, 0x00, 0xff, 0xff, 0xff, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };

            while(1)
            {
                    if (mcast.send(peer0_2,sizeof(peer0_2)) == -1)
                    {
                            ACE_ERROR_RETURN((LM_ERROR, "%p"), -1);
                    }

                    ACE_OS::sleep(5);
            }


            return 0;
    }

    使用wireshark抓包分析校验和出错:

    Checksum: 0xa3ae [incorrect, should be 0x84dd (maybe caused by "UDP checksum offload"?)]   

    问题根源为网卡设置上除了问题:

    #ethtool -k eth0

    # ethtool -k  eth0
    Offload parameters for eth0:
    rx-checksumming: on
    tx-checksumming: off

    scatter-gather: on
    tcp segmentation offload: on 

    全部关闭方法:

    #ethtool -K  eth0 rx off           #K为大写

    #ethtool -K eth0 tx off

    #ethtool -K eth0 sg off

    #ethool -K eth0 tso off

    # ethtool -k  eth0
    Offload parameters for eth0:
    rx-checksumming: off
    tx-checksumming: off
    scatter-gather: off

    tcp segmentation offload: off

    问题解决!

    另外ethtool还可以设置网卡的自适应速率等参数,前不久就遇到过一个很奇怪的事情,交换机和主机进行连接的时候,中间加上一个HUB就可以实现正常通信,但是两者直接直接连接通信不正常,丢包现象严重。最后查找出问题根源为两个设备的网口都为1000M自适应的,由于中间某个设备的网卡在1000M状态下的驱动程序有问题,导致收报的时候出错,从而出现丢包严重。但是中间加入HUB后,设备都与HUB进行协商,从而使设备的网卡速率都下降为了100M,能正常通信。

    使用ethtool可以方便地来查看网卡的状态,速率等诸多信息:

    #ethtool eth0
    Settings for eth0:
            Supported ports: [ TP ]
            Supported link modes:   10baseT/Half 10baseT/Full 
                                    100baseT/Half 100baseT/Full 
                                    1000baseT/Half 1000baseT/Full 
            Supports auto-negotiation: Yes
            Advertised link modes:  10baseT/Half 10baseT/Full 
                                    100baseT/Half 100baseT/Full 
                                    1000baseT/Half 1000baseT/Full 
            Advertised auto-negotiation: Yes
            Speed: 100Mb/s
            Duplex: Full
            Port: Twisted Pair
            PHYAD: 1
            Transceiver: internal
            Auto-negotiation: on
            Supports Wake-on: g
            Wake-on: g
            Current message level: 0x000000ff (255)
            Link detected: yes

    可以通过命令来设置网卡速率自协商等选项     

    ethtool -s DEVNAME
                    [ speed 10|100|1000 ]
                    [ duplex half|full ]   
                    [ port tp|aui|bnc|mii|fibre ]
                    [ autoneg on|off ]
                    [ phyad %d ]
                    [ xcvr internal|external ]
                    [ wol p|u|m|b|a|g|s|d... ]
                    [ sopass %x:%x:%x:%x:%x:%x ]
                    [ msglvl %d ]

    oute add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

  • 相关阅读:
    《编写可维护的JavaScript》读书笔记
    第十四天:还是看代码
    第十三天:过了一遍rt_thread,看代码架构
    第十二天:rt_thread系统
    第十一天:要做stm32了
    第十天:没太专注工作
    第九天:rtc问题查找与测试
    第八天:android编译环境搭建
    第七天:终于看到板子了
    第六天和周末:感慨下这周
  • 原文地址:https://www.cnblogs.com/icemoon1987/p/3149378.html
Copyright © 2020-2023  润新知