gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:48:27 26 4
gpt4 key购买 nike

只要链接发生变化,我就会获取链接的当前状态(基于 this answer ),但是我需要在守护进程启动时获取初始状态。这就是我所拥有的。

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() 方法,这样我就不必调用我的接口(interface),因为我的接口(interface)可以在守护程序的生命周期内更改。正如您所看到的,它是一个虚拟接口(interface)。

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

最佳答案

我能够从托尼在这个问题中提供的答案中得出我的答案C code to get the interface name for the IP address in Linux

关于c - 如何在套接字上触发第一个recv消息以获取NETLINK状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42952607/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com