经常需要获取本机的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;
}