Ifreq结构用来配置ip地址、获取ip、获取MTU等等关于网卡的信息,Linux下可以使用ioctl()函数以及结构体struct ifreq来获取网卡的各种信息。
在Linux系统中获取IP地址通常都是通过ifconfig命令来实现的,然而ifconfig命令实际是通过ioctl接口与内核通信。
ioctl( Sock, SIOCGIFCONF, &ifr),第二个参数则对应下面的功能。
SIOCSIFBRDADDR SIOCGIFBRDADDR SIOCSIFNETMASK SIOCGIFNETMASK SIOCSIFADDR | 设置广播地址 获取广播地址 设置子网掩码 获取子网掩码 获取接口地址 |
实例:
//获取本地ip
struct in_addr GetLocalIp(char *pNetworkCard)
{
char device[32]; // 网卡设备
int fd_arp;
struct ifreq ifr; // ifreq结构体
struct sockaddr_in *ptr;
struct in_addr myself; //IP地址
strcpy(device, pNetworkCard);
strcpy(ifr.ifr_name, device);
if ((fd_arp = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
exit(1);
}
if (ioctl(fd_arp, SIOCGIFADDR, &ifr) < 0)
{
printf("ioctl siocgifaddr error");
}
ptr= (struct sockaddr_in *)&ifr.ifr_addr;
myself = ptr->sin_addr;
close(fd_arp);
return myself; //返回IP地址
}