linux c 获取本机所有IP

31 篇文章 0 订阅
4 篇文章 0 订阅

经常需要获取本机的ip地址, 通常的 gethostname和gethostbyname 经常只返回 "127.0.0.1", 这里提供一个返回 "ip1, ip2, ..." 格式的接口.


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <net/if.h>
#include <arpa/inet.h>

char *get_ip()
{
	int fd, num;
	struct ifreq ifq[16];
	struct ifconf ifc;
	int i;
	char *ips, *tmp_ip;
	char *delim = ",";
	int val;
	
	fd = socket(AF_INET, SOCK_DGRAM, 0);
	if(fd < 0)
	{
		fprintf(stderr, "socket failed\n");
		return NULL;
	}
	ifc.ifc_len = sizeof(ifq);
	ifc.ifc_buf = (caddr_t)ifq;
	if(ioctl(fd, SIOCGIFCONF, (char *)&ifc))
	{
		fprintf(stderr, "ioctl failed\n");
		return NULL;
	}
	num = ifc.ifc_len / sizeof(struct ifreq);
	if(ioctl(fd, SIOCGIFADDR, (char *)&ifq[num-1]))
	{
		fprintf(stderr, "ioctl failed\n");
		return NULL;
	}
	close(fd);
	
	val = 0;
	for(i=0; i<num; i++)
	{
		tmp_ip = inet_ntoa(((struct sockaddr_in*)(&ifq[i].ifr_addr))-> sin_addr);
		if(strcmp(tmp_ip, "127.0.0.1") != 0)
		{
			val++;
		}
	}
	
	ips = (char *)malloc(val * 16 * sizeof(char));
	if(ips == NULL)
	{
		fprintf(stderr, "malloc failed\n");
		return NULL;
	}
	memset(ips, 0, val * 16 * sizeof(char));
	val = 0;
	for(i=0; i<num; i++)
	{
		tmp_ip = inet_ntoa(((struct sockaddr_in*)(&ifq[i].ifr_addr))-> sin_addr);
		if(strcmp(tmp_ip, "127.0.0.1") != 0)
		{
			if(val > 0)
			{
				strcat(ips, delim);
			}
			strcat(ips, tmp_ip);
			val ++;
		}
	}
	
	return ips;
}

int main()
{
	char *ips;
	ips = get_ip();
	free(ips);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值