获取ip地址

#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <net/if.h>
#include <string.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <arpa/inet.h>
int main(){
    char* eth = "wlan0";
    char ip[20] = "";
    int hskt = socket(AF_INET,SOCK_DGRAM,0);
    struct ifreq ifr;
    memset(&ifr,0,sizeof(struct ifreq));
    strcpy(ifr.ifr_name,eth);
    ioctl(hskt,SIOCGIFADDR,&ifr);
#if 0
    unsigned char* m = (unsigned char*)&ifr.ifr_addr.sa_data;
    close(hskt);
    sprintf(ip,"%d.%d.%d.%d",m[2],m[3],m[4],m[5]);
#else
    char* s = inet_ntoa(((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr);
//    strcpy(ip,s);
    ip = s;
#endif
    printf("ip = %s\n",ip);
}
//对程序做两点说明:
1:ioctl中SIOCGIFADDR标志用来获取接口地址。
2:struct ifreq{
    char ifr_name[IFNAMSIZ];
    union{
        struct sockaddr ifru_addr;
        struct sockaddr ifru_dstaddr;
         //还有几个....
    }ifr_ifru;    
};
#define ifr_addr ifr_ifru.ifru_addr  /*address*/
所以程序中ifr.ifr_addr就是ifr_ifru.ifru_addr;
也就是struct sockaddr ifru_addr;
下面来看看struct sockaddr与struct sockaddr_in的结构
struct sockaddr{
    uint8_t        sa_len;
    sa_family_t sa_family;
    char        sa_data[14];
};
struct sockaddr_in{
    uint8_t        sin_len;
    sa_family_t    sin_family;
    in_port_t      sin_port;//2
    struct in_addr sin_addr;//4
    char           sin_zero[8];//8
};
struct in_addr{
    in_addr_t s_addr;
}
看到这块大家也许能明白为什么程序中两种方法都可以
获取到ip地址了吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值