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