linux 下获得本机IP地址途径

途径1:通过gethostname和gethostbyname获得

       前提是在/etc/hosts文件中加入本机名称 和 本机ip地址,例如:

                   arm       192.168.0.11

       通过gethostname得到本机名称arm,将arm传到gethostbyname中会得到一个指向struct hostent 结构的指针,这个结构中包涵ip地址等有关信息.

途径2:通过ioctl获得

      通过给ioctl函数传递SIOCGIFADDR参数就能直接获得本机ip地址,返回的内容放到ioctl的第三个参数中,而第三个参数是一个struct ifreq结构的指针.

      当然在调用ioctl之前先要指定是想获得哪个网络设备的ip地址,比如eth0,lo,eth1等等...通过给struct ifreq结构里的ifr_name成员复值.下面是示例代码:

     

1 #include<stdio.h>
 2 #include<arpa/inet.h>   //for inet_ntoa , struct sockaddr_in
 3 #include<unistd.h>
 4 #include<sys/ioctl.h>
 5 #include<sys/socket.h>  
 6 #include<net/if.h>      //for struct ifreq
 7 #include<string.h>      
 8 int main(void){
 9         int sockfd;
10         struct ifreq ifr;
11         struct sockaddr_in sin;
12         if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0){
13                 perror("socket error");
14                 return -1;
15         }       
16         strcpy(ifr.ifr_name,"eth0");
17         if(ioctl(sockfd,SIOCGIFADDR,&ifr)<0){ //get eth0 ip
18                 perror("ioctl error");
19                 return -1;
20         }       
21         memcpy(&sin,&ifr.ifr_addr,sizeof(sin));
22         //sin=(struct sockaddr_in)ifr.ifr_addr;
23         printf("ip is %s\n",inet_ntoa(sin.sin_addr));
24         return 0;
25 }       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值