方法有很多种,这里介绍下使用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函数。