下面两种方法,都是通过主机名称来获取主机的IP地址,在获取本地IP地址时,一般都是回环地址,但可以有效的根据主机名称获取网络中的主机的IP地址,如通过域名获取域名对应的IP地址。
要想精确的获取某块网卡绑定的IP地址,请根据ioctl()和接口名称(如eth0)来获取,具体实现见上文。
方法三:getaddrinfo()获取本地IP地址 注意,getaddrinfo()可以完成网络主机中主机名和服务名到地址的映射,但是一般不能用来获取本地IP地址,当它用来获取本地IP地址时,返回的一般是127.0.0.1本地回环地址。 所需头文件:
#include <sys/types.h> #include <sys/socket.h> #include <netdb.h>用例如下:
#include <netdb.h> #include <arpa/inet.h> #include <sys/socket.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(int argc,char* argv[]) { char host_name[128]={NULL}; gethostname(host_name, sizeof(host_name));//获取本地主机名称 printf("host_name:%s\n",host_name); struct addrinfo *ailist=NULL,*aip=NULL; struct sockaddr_in *saddr; char *addr; int ret=getaddrinfo(host_name,NULL,NULL,&ailist); for(aip=ailist; aip!=NULL; aip=aip->ai_next) { if(aip->ai_family==AF_INET) { saddr=(struct sockaddr_in*)aip->ai_addr; addr=inet_ntoa(saddr->sin_addr); } printf("addr:%s\n",addr); } printf("\n-----------------baidu host info-------------------\n"); getaddrinfo("www.baidu.com","http",NULL,&ailist); for(aip=ailist; aip!=NULL; aip=aip->ai_next) { if(aip->ai_family==AF_INET) { saddr=(struct sockaddr_in*)aip->ai_addr; addr=inet_ntoa(saddr->sin_addr); } printf("baidu addr:%s\n",addr); } getchar(); return 0; }使用gcc编译此程序会出现error: dereferencing pointer to incomplete type的错误,使用g++编译通过,程序输出:
方法四:gethostname()获取本地IP地址 gethostname()和getaddrinfo()的功能类似,一般用于通过主机名或者服务名,比如域名来获取主机的IP地址。但是要想获取本地IP地址的时候,一般获取的是回环地址127.0.0.1。
string getLocalIP(char* local_ip) { // 获取本地IP时,一般都是127.0.0.1 char host_name[128]=""; struct hostent *host_ent; gethostname(host_name, sizeof(host_name)); host_ent = gethostbyname(host_name); const char* first_ip = inet_ntoa(*(struct in_addr*)(host_ent->h_addr_list[0])); memcpy(local_ip, first_ip, 16); return string(host_name); }