ifreq用来保存某个接口的信息,ifconf用来保存所有接口信息。
以下为获取本地网卡名,仿ifconfig功能:
1. 先通过ioctl获得本地所有接口的信息,并保存在ifconf中
2. 再从ifconf中取出每一个ifreq中表示ip地址的信息
3. ifconf的两个成员初始化
ifc_len:表示用来存放所有接口信息的缓冲区长度
ifc_buf:表示存放接口信息的缓冲区
需要在程序开始时对ifconf的ifc_len和ifc_buf进行初始化
接下来使用ioctl获取所有接口信息,完成后ifc_len内存放实际获得的接口信息总长度
并且信息被存放在ifc_buf中。
示例:
int ifconfig()
{
struct sockaddr_in sin;
char buff[512] = {0};
struct ifconf ifc;
ifc.ifc_len = 512;
ifc.ifc_buf = buff;
int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(sock_fd >= 0)
{
/*获取所有接口清单*/
if (ioctl(sock_fd, SIOCGIFCONF, &ifc) < 0)
{
common_printf("SIOCGIFCONF failed: %s", strerror(errno));
return -1;
}
/*计算获得的接口个数*/
int count = ifc.ifc_len / sizeof(struct ifreq);
struct ifreq *ifr = (struct ifreq *)buff;
for(int i = 0; i<count; i++)
{
common_printf("%d interface name: %s", i, ifr[i].ifr_name);
}
}
close(sock_fd);
return 0;
}