无论何时更改,我都会获取链接的当前状态,但是当我的守护程序启动时,我需要获取初始状态。这就是我所拥有的。
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循环之前触发调用,这样我就可以阅读第一条消息了。
答案 0 :(得分:0)
我能够从Tony在这个问题C code to get the interface name for the IP address in Linux
中提供的答案中得出答案