C Linux以编程方式上/下接口内核
在内核空间中启用或禁用接口的编程方式是什么?应该做什么?…通过使用IOCTL的C Linux以编程方式上/下接口内核,c,linux,network-programming,linux-kernel,C,Linux,Network Programming,Linux 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
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);
}
粘贴自的代码副本。打开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);
intsockfd;
结构ifreq-ifr;
sockfd=插座(AF_INET,SOCK_DGRAM,0);
if(sockfd<0)
返回;
memset(&ifr,0,ifr的大小);
strncpy(ifr.ifr_名称,“eth0”,IFNAMSIZ);
ifr.ifr_flags |=IFF_UP;
ioctl(sockfd、SIOCSIFFLAGS和ifr);
什么类型的接口,使用什么语言?事实上我没有提到,但它将是C和eth类型。
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);