如何使用C ++获取eth0的本地ip?

时间:2014-12-25 02:53:07

标签: c++ sockets networking

我想在本地网络中找到eth0的IP地址(如果电缆已插入)或者返回环回IP(127.0.0.1)。所以,我尝试了以下代码:

struct in_addr getCurrentIP() {
    int fd=0;
    struct ifreq ifr;
    struct in_addr IP;
    fd = socket(AF_INET, SOCK_DGRAM, 0);
    ifr.ifr_addr.sa_family = AF_INET;
    strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
    if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
        perror("SIOCGIFFLAGS");}
    if ((ifr.ifr_flags & IFF_UP)){
        ioctl(fd, SIOCGIFADDR, &ifr);
        close(fd);
        IP = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
    } else {
        close(fd);
        inet_aton ("127.0.0.1",&IP);
    }
    return  IP;
}

此代码正常工作,直到我插入以太网电缆。然后,它返回任意IP

PS我连接到提供动态IP的网络(即使用DHCP)。

1 个答案:

答案 0 :(得分:0)

我解决了,这是解决方案:

struct in_addr getCurrentIP() {
    int fd=0;
    struct ifreq ifr;
    struct in_addr IP;
    fd = socket(AF_INET, SOCK_DGRAM, 0);
    ifr.ifr_addr.sa_family = AF_INET;
    strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
    if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
        perror("SIOCGIFFLAGS");}
    if ((ifr.ifr_flags & IFF_UP) && (ifr.ifr_flags & IFF_RUNNING)){
        ioctl(fd, SIOCGIFADDR, &ifr);
        close(fd);
        IP = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
    } else {
        close(fd);
        inet_aton ("127.0.0.1",&IP);
    }
    return  IP;
}

我想感谢你的帮助。