当前位置:  开发笔记 > 运维 > 正文

获取Linux上接口的IP地址

如何解决《获取Linux上接口的IP地址》经验,为你挑选了3个好方法。

如何从C代码获取Linux上接口的IPv4地址?

例如,我想获取分配给eth0的IP地址(如果有).



1> Filip Ekberg..:

试试这个:

#include 
#include 
#include  /* for strncpy */

#include 
#include 
#include 
#include 
#include 
#include 

int
main()
{
 int fd;
 struct ifreq ifr;

 fd = socket(AF_INET, SOCK_DGRAM, 0);

 /* I want to get an IPv4 IP address */
 ifr.ifr_addr.sa_family = AF_INET;

 /* I want IP address attached to "eth0" */
 strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);

 ioctl(fd, SIOCGIFADDR, &ifr);

 close(fd);

 /* display result */
 printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));

 return 0;
}

代码示例取自此处.


如果将`SIOCGIFADDR`更改为`SIOCGIFNETMASK`,则可以获取接口的网络掩码.
值得检查`ioctl()`的返回值,如果它不为零,请检查`errno`的值.
如果"eth0"不存在怎么办?如何检查错误?
@zapstar我认为这是不正确的。在`strncpy`联机帮助页中:_警告:如果src的前n个字节中没有空字节,则放置在dest中的字符串将不以空值结尾。

2> Duck..:

除了ioctl()方法,Filip演示了你可以使用getifaddrs().手册页底部有一个示例程序.



3> sjsam..:

如果您正在寻找特定接口的地址(IPv4),请说wlan0然后尝试使用getifaddrs()的代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main(int argc, char *argv[])
{
    struct ifaddrs *ifaddr, *ifa;
    int family, s;
    char host[NI_MAXHOST];

    if (getifaddrs(&ifaddr) == -1) 
    {
        perror("getifaddrs");
        exit(EXIT_FAILURE);
    }


    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) 
    {
        if (ifa->ifa_addr == NULL)
            continue;  

        s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);

        if((strcmp(ifa->ifa_name,"wlan0")==0)&&(ifa->ifa_addr->sa_family==AF_INET))
        {
            if (s != 0)
            {
                printf("getnameinfo() failed: %s\n", gai_strerror(s));
                exit(EXIT_FAILURE);
            }
            printf("\tInterface : <%s>\n",ifa->ifa_name );
            printf("\t  Address : <%s>\n", host); 
        }
    }

    freeifaddrs(ifaddr);
    exit(EXIT_SUCCESS);
}

你可以用eth0替换wlan0代替ethernet,lo代替本地环回.

可以在此处找到所使用的数据结构的结构和详细说明.

要了解有关C中链表的更多信息,这个页面将是一个很好的起点.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有