如何在套接字上触发第一个recv消息以获取NETLINK状态

时间:2017-03-22 13:09:48

标签: c sockets netlink

无论何时更改,我都会获取链接的当前状态,但是当我的守护程序启动时,我需要获取初始状态。这就是我所拥有的。

void read_msg(int fd) {
   // loop through the struct nlmsghdr and pull struct ifinfomsg
   // data to get the flags.
}

int main(int argc, char* argv[]) {
    memset(&sa, 0, sizeof(sa));
    sa.nl_family = AF_NETLINK;
    sa.nl_groups = RTMGRP_LINK;

    fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
    if(fd == -1) 
    {
        perror("Failed to Open Socket");
        return 1;
    }

    struct ifreq ifr;
    memset(&ifr, 0, sizeof(ifr));
    snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", cmd_params.iface);
    if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (void*)&ifr,
        sizeof(ifr)) < 0) 
    {
            perror("Failed to bind to given interface");
            return 1;
    }

    if(bind(fd, (struct sockaddr *) &sa, sizeof(sa)) == -1) 
    {
        perror("Failed to bind to socket");
        return 1;
    }

    <--- HERE IS MY ISSUE ------->
    get_link_state("eth0");
    <-- this function uses ioctl(fd, SIOCGIFINDEX, "vif2.0") 
        and ioctl(fd, SIOCGIFFLAGS, struct ifreq*)
    -->

    while(true) {
        read_msg(fd);
    }
}

我想避免使用我现在使用的get_link_state()方法,因此我不必调用我的界面,因为我的界面可以在守护程序的生命周期内更改。你可以看到它是一个虚拟界面。

最后我的问题是,有什么方法可以在while循环之前触发调用,这样我就可以阅读第一条消息了。

1 个答案:

答案 0 :(得分:0)

我能够从Tony在这个问题C code to get the interface name for the IP address in Linux

中提供的答案中得出答案