Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 添加带有libnl-3-route的路由;无效的输入数据或参数";_C++_C_Routes_Netlink - Fatal编程技术网

C++ 添加带有libnl-3-route的路由;无效的输入数据或参数";

C++ 添加带有libnl-3-route的路由;无效的输入数据或参数";,c++,c,routes,netlink,C++,C,Routes,Netlink,我试图用libnl-3-routing添加路由(内核2.6.32-57)。我使用以下文档: 但是路由章节是空的…;) 问题是内核响应带有“无效的输入数据或参数”。我已经使用netlink进行了一些测试,如果我设置了以下属性,我可以添加路由: 界面索引 目的地址 网关地址 面具 int ret = 0; // Create the route. struct rtnl_route* rulesRoute = rtnl_route_alloc(); rtnl_ro

我试图用libnl-3-routing添加路由(内核2.6.32-57)。我使用以下文档:

  • 但是路由章节是空的…;)

    问题是内核响应带有“无效的输入数据或参数”。我已经使用netlink进行了一些测试,如果我设置了以下属性,我可以添加路由:

  • 界面索引
  • 目的地址
  • 网关地址
  • 面具

        int ret = 0;
        // Create the route.
        struct rtnl_route* rulesRoute = rtnl_route_alloc();
        rtnl_route_set_iif(rulesRoute, AF_INET); // IPV4
    
        // Set parameters.
        rtnl_route_set_scope(rulesRoute, RT_SCOPE_UNIVERSE);
        rtnl_route_set_table(rulesRoute, RT_TABLE_MAIN);
        rtnl_route_set_protocol(rulesRoute, RTPROT_STATIC);
        uint8_t maskTest = 16;
        rtnl_route_set_scope(rulesRoute, maskTest);
    
        // Set the destination.
        char destinationAddr[] = "0.0.0.0";
        nl_addr* dstAddr = nl_addr_build(AF_INET, destinationAddr, 8);
        ret = rtnl_route_set_dst(rulesRoute, dstAddr);
        if (ret != 0)
            std::cout << "Error in setting destination route: " << nl_geterror(ret) << std::endl;
    
        // Set the next hop.
        struct rtnl_nexthop* route_nexthop = rtnl_route_nh_alloc();
        char gatewayAddr[] = "10.110.0.240";
        nl_addr* gatewAddr = nl_addr_build(AF_INET, gatewayAddr, 12);
        rtnl_route_nh_set_gateway(route_nexthop, gatewAddr);
        rtnl_route_nh_set_ifindex(route_nexthop, 2);
        rtnl_route_add_nexthop(rulesRoute, route_nexthop);
        ret = rtnl_route_add(m_nlSocket, rulesRoute, 0);
        if (ret != 0)
            std::cout << "Kernel response:" << nl_geterror(ret) << std::endl;
    

    感谢您帮助解决此问题

    此问题源于函数nl_addr_build的错误使用

    替换为nl_addr_parse(),这样就可以了

    nl_addr_构建:解析二进制addr


    nl_addr_parse:解析像“10.10.1.10”这样的char*addr

    链接被破坏:(是的,项目可能已经死了,文档从未完成,库自2014年以来没有更新过。我们最近删除了该项目的所有依赖项,并使用对二进制文件的调用(ip路由,ip链接,…)相反,将所有文档移动到,这至少可以正常工作。注意:关于文档:distros开始使用(原作者的代码,托管在不同的位置,现在也在github上作为fork:),此处的路由为空:。幸运的是,这里有一些示例,请参阅
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    10.110.0.0      0.0.0.0         255.255.255.0   U     1      0        0 eth3
    169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth3
    0.0.0.0         10.110.0.1      0.0.0.0         UG    0      0        0 eth3