2017-03-22 16 views
0

私のリンクの現在のステータスは変更されるたびに得られますが、デーモンの起動時に初期状態を取得する必要があります。これは私が持っているものです。NETLINKステータスを取得するためにソケット上の最初のrecvメッセージをトリガする方法

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ループの前に呼び出しをトリガすることができる方法はありますか?

答えて

関連する問題