socket 通过 ioctl获取 设置 网卡 IP 子网掩码 本地广播地址

来源:互联网 发布:青年网络公开课腾讯 编辑:程序博客网 时间:2024/04/29 13:19

参看 http://blog.chinaunix.net/uid-20692625-id-3172833.html




类别

Request

说明

数据类型

套 
接 

SIOCATMARK 
SIOCSPGRP 
SIOCGPGRP

是否位于带外标记 
设置套接口的进程ID 或进程组ID 
获取套接口的进程ID 或进程组ID

int 
int 
int

文 

FIONBIN 
FIOASYNC 
FIONREAD 
FIOSETOWN 
FIOGETOWN

设置/ 清除非阻塞I/O 标志 
设置/ 清除信号驱动异步I/O 标志 
获取接收缓存区中的字节数 
设置文件的进程ID 或进程组ID 
获取文件的进程ID 或进程组ID

int 
int 
int 
int 
int

接 

SIOCGIFCONF 
SIOCSIFADDR 
SIOCGIFADDR 
SIOCSIFFLAGS 
SIOCGIFFLAGS 
SIOCSIFDSTADDR 
SIOCGIFDSTADDR 
SIOCGIFBRDADDR 
SIOCSIFBRDADDR 
SIOCGIFNETMASK 
SIOCSIFNETMASK 
SIOCGIFMETRIC 
SIOCSIFMETRIC 
SIOCGIFMTU 
SIOCxxx

获取所有接口的清单 
设置接口地址 
获取接口地址 
设置接口标志 
获取接口标志 
设置点到点地址 
获取点到点地址 
获取广播地址 
设置广播地址 
获取子网掩码 
设置子网掩码 
获取接口的测度 
设置接口的测度 
获取接口MTU 
(还有很多取决于系统的实现)

struct ifconf 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq

ARP

SIOCSARP 
SIOCGARP 
SIOCDARP

创建/ 修改ARP 表项 
获取ARP 表项 
删除ARP 表项

struct arpreq 
struct arpreq 
struct arpreq

路 

SIOCADDRT 
SIOCDELRT

增加路径 
删除路径

struct rtentry 
struct rtentry

I_xxx

 

 


#include <stdio.h>#include <fcntl.h>#include <string.h>#include <sys/stat.h>#include <sys/socket.h>#include <sys/ioctl.h>#include <net/if.h>#include <netinet/in.h>#include <arpa/inet.h>#if 0struct ifreq{char ifr_name[IFNAMSIZ]; /* Interface name */ union { struct sockaddr ifr_addr; struct sockaddr ifr_dstaddr; struct sockaddr ifr_broadaddr; struct sockaddr ifr_netmask; struct sockaddr ifr_hwaddr; short ifr_flags; int ifr_ifindex; int ifr_metric; int ifr_mtu; struct ifmap ifr_map; char ifr_slave[IFNAMSIZ]; char ifr_newname[IFNAMSIZ]; char * ifr_data; }; }struct ifconf { int ifc_len; /* size of buffer */union { char * ifc_buf; /* buffer ddress */ struct ifreq *ifc_req; /* array of structures */}; };#endif int MyifconfigTest(){int i = 0;struct ifreq * ifr = NULL;struct ifconf ifc;//初始化ifconfunsigned char buf[1024] = {0};ifc.ifc_len = 1024;ifc.ifc_buf = buf;int sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock < 0){    perror("create socket failed:");    return -1;}if (ioctl(sock, SIOCGIFCONF, (char *) &ifc) < 0){    perror("ioctl-conf:");close(sock);    return -1;}//printf("ifc.ifc_len %d\n",ifc.ifc_len);//printf("We have %d network card\n",ifc.ifc_len/sizeof(struct ifreq));ifr = (struct ifreq*)buf;  for(i = 0;i < ifc.ifc_len/sizeof(struct ifreq);i++){//网卡名printf("\n%s", ifr->ifr_name);//网卡flags值if(ioctl(sock, SIOCGIFFLAGS, ifr)>=0){if(IFF_UP & ifr->ifr_flags){printf(" [UP]\n");}else /*if(IFF_DOWN & ifr->ifr_flags)*/{printf(" [DOWN]\n");}}else{perror("ioctl SIOCGIFFLAGS error");}//网卡硬件地址if(ioctl(sock, SIOCGIFHWADDR, ifr)>=0){u_int8_t hd[6] = {0};memcpy(hd, ifr->ifr_hwaddr.sa_data, sizeof(hd));printf("HWaddr: %02X:%02X:%02X:%02X:%02X:%02X\n", hd[0], hd[1], hd[2], hd[3], hd[4], hd[5]);}else{perror("ioctl SIOCGIFHWADDR error");}//网卡本地IP地址//Getif(ioctl(sock, SIOCGIFADDR, ifr)>=0){printf("IP: %s\n",inet_ntoa(((struct sockaddr_in*)&(ifr->ifr_addr))->sin_addr));}else{perror("ioctl SIOCGIFADDR error");}//Set//if(0 == strncmp("vmnet8",ifr->ifr_name,strlen("vmnet8")))if(0){printf("!!set vmnet8 IP!!\n");inet_aton( "192.168.117.4",&(((struct sockaddr_in*)&(ifr->ifr_addr))->sin_addr));if(ioctl( sock, SIOCSIFADDR, ifr)>=0)printf("ioctl SIOCSIFADDR success.\n");else    perror("ioctl SIOCSIFADDR error");}//网卡本地广播地址//Getif(ioctl(sock, SIOCGIFBRDADDR, ifr)>=0){printf("Bcast: %s\n",inet_ntoa(((struct sockaddr_in*)&(ifr->ifr_broadaddr))->sin_addr));}else{perror("ioctl SIOCGIFBRDADDR error");}//Set//if(0 == strncmp("vmnet8",ifr->ifr_name,strlen("vmnet8")))if(0){printf("!!set vmnet8 Bcast!!\n");inet_aton( "192.168.117.255",&(((struct sockaddr_in*)&(ifr->ifr_broadaddr))->sin_addr));if(ioctl( sock, SIOCSIFBRDADDR, ifr)>=0)printf("ioctl SIOCSIFBRDADDR success.\n");else    perror("ioctl SIOCSIFBRDADDR error");}//网卡子网掩码地址//Getif(ioctl(sock, SIOCGIFNETMASK, ifr)>=0){printf("Mask: %s\n",inet_ntoa(((struct sockaddr_in*)&(ifr->ifr_netmask))->sin_addr));}else{perror("ioctl SIOCGIFNETMASK error");}//Set//if(0 == strncmp("vmnet8",ifr->ifr_name,strlen("vmnet8")))if(0){printf("!!set vmnet8 Mask!!\n");inet_aton( "255.255.255.0",&(((struct sockaddr_in*)&(ifr->ifr_netmask))->sin_addr));if(ioctl( sock, SIOCSIFNETMASK, ifr)>=0)printf("ioctl SIOCSIFNETMASK success.\n");else    perror("ioctl SIOCSIFNETMASK error");}//网卡MTU值if(ioctl(sock, SIOCGIFMTU, ifr)>=0){printf("MTU: %d\n",ifr->ifr_mtu);}else{perror("ioctl SIOCGIFMTU error");}//网卡NREAD值int nread = 0;if(ioctl(sock, FIONREAD, &nread)>=0){printf("nread: %d\n",nread);}else{perror("ioctl FIONREAD error");}ifr++;  }close(sock);}int main(int argc,char **argv){MyifconfigTest();}


0 0
原创粉丝点击