linux如何获取本地ip?

来源:互联网 发布:linux gcc编译器下载 编辑:程序博客网 时间:2024/06/08 06:13

方法有很多种,这里介绍下使用ioctl获取本地ip的方法。

先介绍下ioctl,ioctl是设备驱动程序里对设备的I/O通道进行管理,所谓对I/O通道进行管理,就是获取或设置设备的一些特性参数。

我们可以利用ioctl获取网卡设备的IP。

具体代码实现如下:

uint32_t getMachineLocalIp(char *interface){if (NULL == interface){printf("[getMachineLocalIp]interface is null\n");return 0;}int sockfd = socket(AF_INET,SOCK_DGRAM,0);if (-1 == sockfd){printf("[getMachineLocalIp]socket fail\n");return 0;}struct ifreq ifr;strcpy(ifr.ifr_name,interface);int ioret = ioctl(sockfd,SIOCGIFADDR,&ifr);if (-1 == ioret){printf("[getMachineLocalIp] ioctl fail\n");close(sockfd);return 0;}struct sockaddr_in sin;memcpy(&sin,&(ifr.ifr_addr),sizeof(struct sockaddr_in));close(sockfd);return sin.sin_addr.s_addr;}

char *interface是网卡名字,比如eth0,eth1,,,

创建socket目的是得到网卡的一个文件描述符,最终得到的ip信息存储在ifr.ifr_addr里,它是个struct sockaddr结构。

我们习惯转换为struct sockaddr_in再操作。


拓展:

如此得到的ip是十进制长整型,如果要转换成点分十进制字符串,使用inet_ntoa函数。

反过来则使用inet_addr函数。


原创粉丝点击