ifup(8)C中的等效代码

时间:2013-11-07 22:49:15

标签: c linux

我一直在搜索ifup的源代码,但我找不到任何内容。相反,我稍微修改了ifdown.c并使用以下代码:

int ifup(char interface[])
{
    struct ifreq ifr[64];
    struct ifconf ifc;
    int i, fd;
    int numif;
    int shaper;

    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        fprintf(stderr, "ifdown: ");
        perror("socket");
        return -1;
    }
    ifc.ifc_len = sizeof(ifr);
    ifc.ifc_req = ifr;

    if (ioctl(fd, SIOCGIFCONF, &ifc) < 0) {
        fprintf(stderr, "ifup: ");
        perror("SIOCGIFCONF");
        close(fd);
        return -1;
    }
    numif = ifc.ifc_len / sizeof(struct ifreq);

    for (shaper = 1; shaper >= 0; shaper--) {
        for (i = 0; i < numif; i++) {
            if (strcmp(ifr[i].ifr_name, interface) == 0){
                ifr[i].ifr_flags |= (IFF_UP);
                if (ioctl(fd, SIOCSIFFLAGS, &ifr[i]) < 0) {
                    fprintf(stderr, "ifup: shutdown ");
                    perror(ifr[i].ifr_name);
                }
            }
        }
    }
    close(fd);

    return 0;
}

如果我使用上面的代码执行ifdown("wlan0");ifup("wlan0");,则会禁用然后启用该接口。最后,我看到界面在iwconfig上有IP地址和essid等。我可以ping我的路由器,但是,我无法ping任何域或直接IP地址

ping 74.125.232.98输出

connect: Network is unreachable

除非我通过网络管理器断开连接并再次连接到我的路由器。

如果我从终端使用ifup(8),则没有这样的问题。

有人可以告诉我还需要对上面的代码做些什么才能使其成为ifup(8)

2 个答案:

答案 0 :(得分:1)

您必须设置默认路线。 ifup命令会自动为您设置默认路由。您可以在$ route -n来电之前和之后运行ifup来查看此信息。

btw感谢您提供非常有用的代码。

答案 1 :(得分:0)

您必须先设置路由,然后才能访问外部主机