天天看點

linux中的ioctl函數,(10)Linux 網絡程式設計之ioctl函數(示例代碼)

#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);

}

運作結果: