[英]Linux programmatically up/down an interface kernel
在 kernel 空間中啟用或禁用接口的編程方式是什么? 應該做什么?
...通過使用 IOCTL 的...
ioctl(skfd, SIOCSIFFLAGS, &ifr);
...設置或取消設置 IFF_UP 位取決於您是否要相應地啟動或關閉接口,即:
static int set_if_up(char *ifname, short flags)
{
return set_if_flags(ifname, flags | IFF_UP);
}
static int set_if_down(char *ifname, short flags)
{
return set_if_flags(ifname, flags & ~IFF_UP);
}
代碼復制粘貼自Linux 網絡文檔。
啟動 eth0 的代碼:
int sockfd;
struct ifreq ifr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
return;
memset(&ifr, 0, sizeof ifr);
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
ifr.ifr_flags |= IFF_UP;
ioctl(sockfd, SIOCSIFFLAGS, &ifr);
int skfd = -1; /* AF_INET socket for ioctl() calls.*/
int set_if_flags(char *ifname, short flags)
{
struct ifreq ifr;
int res = 0;
ifr.ifr_flags = flags;
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
printf("socket error %s\n", strerror(errno));
res = 1;
goto out;
}
res = ioctl(skfd, SIOCSIFFLAGS, &ifr);
if (res < 0) {
printf("Interface '%s': Error: SIOCSIFFLAGS failed: %s\n",
ifname, strerror(errno));
} else {
printf("Interface '%s': flags set to %04X.\n", ifname, flags);
}
out:
return res;
}
int set_if_up(char *ifname, short flags)
{
return set_if_flags(ifname, flags | IFF_UP);
}
用法:
set_if_up("eth0", 1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.