Linux 下 可以使用ioctl()函数以及结构体 struct ifreq和结构体struct ifconf来获取网络接口的各种信息。
如图,有br0和br1两个接口,当前需要获取br1的ip地址(当然其他接口信息如mac、子网掩码等都可以),方法如下:
具体过程是先通过ictol获取本地的所有接口信息,存放到ifconf结构中,再从其中取出每个ifreq表示的ip信息(一般每个网卡对应一个IP地址,如:”eth0…、eth1…”)。
头文件:
1 #include <arpa/inet.h> 2 #include <net/if.h> 3 #include <sys/ioctl.h> 4 #include <sys/socket.h>
代码:
1 static int lanGetBr1IpAddr(const char *ifName, char *ipAddr, UINT32 addrLen) 2 { 3 int ret = -1; 4 struct ifreq ifr; 5 struct sockaddr_in *sin; 6 int sock; 7 8 printf("ifname:%s", ifr.ifr_name); 9 sock = socket(AF_INET, SOCK_DGRAM, 0); 10 strncpy(ifr.ifr_name, ifName, sizeof(ifr.ifr_name)); 11 12 if (0 > (ret = ioctl(sock, SIOCGIFADDR, &ifr))) 13 { 14 printf("ioctl get SIOCGIFADDR failed!!"); 15 return -1; 16 } 17 close(sock); 18 19 sin = (struct sockaddr_in *)&(ifr.ifr_addr); 20 if (NULL == inet_ntoa(sin->sin_addr)) 21 { 22 return -1; 23 } 24 strncpy(ipAddr, inet_ntoa(sin->sin_addr), addrLen); 25 26 return ret; 27 }
获取成功存入数据库并给前台:
写这段代码的时候遇到个小问题,本来想打印未经转换的IP地址 sin_addr,一直不成功,实际上这时候的地址是整型
typedef
uint32_t in_addr_t;
struct
in_addr
{
in_addr_t s_addr;
};