我在程序中用ioctl函数设置了网卡的ip地址和掩码,但是设置完成后,网络并没有激活,还是不能收发数据,但是退出程序用ifconfig-a查看,设置已经成功,然后用ifconfig激活,就可以收发数据了,请问,能不能用ioctl在设置完ip地址和掩码后,直接用ioctl激活?或者还有其他的方法在程序中直接激活网络设置?谢谢啊
system("ifconfig eth0 192.168.168.1 mask 255.255.255.0");
就可以直接激活了。
[code]
struct ifreq buf[MAXINTERFACES];
struct ifconf ifc;
int fd,intrface;
if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) >= 0) {
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = (caddr_t) buf;
intrface = ifc.ifc_len / sizeof (struct ifreq);
printf("interface num is intrface=%d/n/n/n",intrface);
while (intrface-- > 0)
{
if (!ioctl (fd, SIOCGIFCONF, (char *) &ifc)) {
ioctl (fd, SIOCGIFFLAGS, (char *) &buf[intrface]);
if (!buf[intrface].ifr_flags & IFF_UP) {
buf[intrface].ifr_flags |=IFF_UP;
}
ioctl (fd, SIOCSIFFLAGS, (char *) &buf[intrface]);
}
close(fd);
[/code]
不用多解释了吧?
版主,你好,我不会用那些ioctl,比如:ioctl (fd, SIOCGIFCONF, (char *) &ifc)和ioctl (fd, SIOCGIFFLAGS, (char *) &buf[intrface]),你能不能解释一下?多谢。
ioctl是系统调用,用于对设备的操作,如果你了解一些驱动源码的话,应该明白。具体地说,ioctl是向内核提交一个命令,用于获取或者设置和设备相关的参数。SIOCGIFCONF是获取,SIOCSIFFLAGS是设置,看到区别了吗?
ioctl (fd, SIOCGIFFLAGS, (char *) &buf[intrface]);这句是获取设备的当前状态
buf[intrface].ifr_flags |=IFF_UP;设置激活标志
ioctl (fd, SIOCSIFFLAGS, (char *) &buf[intrface]);然后设置,很简单吧。
谢谢版主指导