linux如何获取本地ip?

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值