#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char*argv[]){
int s;
int err;
s=socket(AF_INET,SOCK_DGRAM,0);
if(s<0){
perror("socket error");
return;
}
//傳入網絡接口序号,獲得網絡接口的名稱
struct ifreq ifr;
ifr.ifr_ifindex=2;//獲得第2個網絡接口的名稱
err=ioctl(s,SIOCGIFNAME,&ifr);
if(err){
perror("index error");
}else{
printf("the %dst interface is:%s\n",ifr.ifr_ifindex,ifr.ifr_name);
}
//傳入網絡接口名稱,獲得标志
memcpy(ifr.ifr_name,"eth0",5);
err=ioctl(s,SIOCGIFFLAGS,&ifr);
if(!err){
printf("SIOCGIFFLAGS:%d\n",ifr.ifr_flags);
}
//獲得MTU和MAC
err=ioctl(s,SIOCGIFMTU,&ifr);
if(!err){
printf("SIOCGIFMTU:%d\n",ifr.ifr_mtu);
}
//獲得MAC位址
err=ioctl(s,SIOCGIFHWADDR,&ifr);
if(!err){
unsigned char* hw=ifr.ifr_hwaddr.sa_data;
printf("SIOCGIFHWADDR:%02x:%02x:%02x:%02x:%02x:%02x\n",hw[0],hw[1],hw[2],hw[3],hw[4],hw[5]);
}
//獲得網卡映射參數 指令字SIOCGIFMAP
err=ioctl(s,SIOCGIFMAP,&ifr);
if(!err){
printf("SIOCGIFMAP,mem_start:%d,mem_end:%d,base_addr:%d,ifr_map:%d,dma:%d,port:%d\n",ifr.ifr_map.mem_start,ifr.ifr_map.mem_end,ifr.ifr_map.base_addr,ifr.ifr_map.irq,ifr.ifr_map.dma,ifr.ifr_map.port);
}
//獲得網卡序号
err=ioctl(s,SIOCGIFINDEX,&ifr);
if(!err){
printf("SIOCGIFINDEX:%d\n",ifr.ifr_ifindex);
}
//擷取發送隊列的長度
err=ioctl(s,SIOCGIFTXQLEN,&ifr);
if(!err){
printf("SIOCGIFTXQLEN:%d\n",ifr.ifr_qlen);
}
//擷取網絡接口IP
struct sockaddr_in *sin=(struct sockaddr_in*)&ifr.ifr_addr;//儲存的是二進制IP
char ip[16];//字元數組,存放字元串
memset(ip,0,16);
err=ioctl(s,SIOCGIFADDR,&ifr);
if(!err){
inet_ntop(AF_INET,&sin->sin_addr.s_addr,ip,16);//轉換的字元串儲存到ip數組中,第二個參數是要轉換的二進制IP指針,第三個參數是轉換完成存放IP的緩沖區,最後一個參數是緩沖區的長度
printf("SIOCGIFADDR:%s\n",ip);
}
//查詢目标IP位址
err=ioctl(s,SIOCGIFDSTADDR,&ifr);
if(!err){
inet_ntop(AF_INET,&sin->sin_addr.s_addr,ip,16);
printf("SIOCGIFDSTADDR:%s\n",ip);
}
//查詢子網路遮罩
err=ioctl(s,SIOCGIFNETMASK,&ifr);
if(!err){
inet_ntop(AF_INET,&sin->sin_addr.s_addr,ip,16);
printf("SIOCGIFNETMASK:%s\n",ip);
}
//設定IP位址,設定網絡接口
inet_pton(AF_INET,"222.27.253.108",&sin->sin_addr.s_addr);//将字元串IP轉換成二進制
err=ioctl(s,SIOCSIFADDR,&ifr);//發送設定本機ip位址請求指令
if(!err){
printf("check IP-----");
memset(&ifr,0,sizeof(ifr));
memcpy(ifr.ifr_name,"eth0",5);
ioctl(s,SIOCGIFADDR,&ifr);
inet_ntop(AF_INET,&sin->sin_addr.s_addr,ip,16);
printf("%s\n",ip);
}
//得到接口的廣播位址
memset(&ifr,0,sizeof(ifr));
memcpy(ifr.ifr_name,"eth0",5);
ioctl(s,SIOCGIFBRDADDR,&ifr);
struct sockaddr_in *broadcast=(struct sockaddr_in*)&ifr.ifr_broadaddr;
//轉換成字元串
inet_ntop(AF_INET,&broadcast->sin_addr.s_addr,ip,16);//inet_ntop将二進制IP轉換成點分十進制的字元串
printf("BROADCAST IP:%s\n",ip);
close(s);
}
運作結果: