ifconf、ifreq介绍
//ifconf通常是用来保存所有接口信息的
//if.h
struct ifconf
{
int ifc_len; /* size of buffer */
union
{
char *ifcu_buf; /* input from user->kernel*/
struct ifreq *ifcu_req; /* return from kernel->user*/
} ifc_ifcu;
};
#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
#define ifc_req ifc_ifcu.ifcu_req /* array of structures */
//ifreq用来保存某个接口的信息
//if.h
struct ifreq {
char ifr_name[IFNAMSIZ];
union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
short ifru_flags;
int ifru_metric;
caddr_t ifru_data;
} ifr_ifru;
};
#define ifr_addr ifr_ifru.ifru_addr
#define ifr_dstaddr ifr_ifru.ifru_dstaddr
#define ifr_broadaddr ifr_ifru.ifru_broadaddr
可通过下图来加深理解这两个结构体:
使用ioctl与ifonf,ifreq获取广播地址
<span style="font-size:14px;">#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <error.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <fcntl.h>
#define IFNAME "wlan1" <span style="color:#006600;">//看你用的是哪个网,eth0 or eth1...</span>
struct sockaddr_in broadcast_addr;
int main()
{
int sock = -1;
int num = -1;
struct ifreq *ifr;
struct ifconf ifc;
struct sockaddr_in broadcast_addr;
char buffer[1024];
<span style="color:#006600;">//建立数据报套接字</span>
sock = socket(AF_INET, SOCK_DGRAM, 0);
<span style="color:#006600;">// 获取所有套接字接口</span>
ifc.ifc_len = sizeof(buffer);
ifc.ifc_buf = buffer;
if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0){
perror("ioctl-conf:");
}
ifr = ifc.ifc_req;<span style="color:#006600;">//从ifconf中的第一个开始与IFNAME匹配获取其广播地址</span>
for(num=ifc.ifc_len/sizeof(struct ifreq); --num>=0; ifr++){
if(!strcmp(ifr->ifr_name, IFNAME)){
if (ioctl(sock, SIOCGIFBRDADDR, ifr) == -1){
perror("ioctl error");
}
break;
}
}
<span style="color:#006600;">//将获得的广播地址复制到broadcast_addr</span>
memcpy(&broadcast_addr, (char *)&ifr->ifr_broadaddr, sizeof(struct sockaddr_in));
printf("\nBroadcast-IP: %s\n\n", inet_ntoa(broadcast_addr.sin_addr));
} </span><span style="font-size:18px;">
</span>