#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地址了吧。
获取ip地址
最新推荐文章于 2024-06-26 09:20:15 发布