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();}
- socket 通过 ioctl获取 设置 网卡 IP 子网掩码 本地广播地址
- 通过Reachability获取ios本地ip,子网掩码,广播地址
- ioctl 获取本机网卡ip地址 | socket()
- ioctl 获取本机网卡ip地址 | socket() 复制代码
- shell 获取网卡IP地址 子网掩码 默认网关 广播地址 MAC地址
- VC获取IP、子网掩码、网关、广播地址
- IOCTL获取和配置IP地址/子网掩码/网关
- IOCTL获取和配置IP地址/子网掩码/网关
- Linux下获取本地IP地址--------ioctl
- Linux下获取本地IP地址--------ioctl
- ioctl获取本地IP和MAC地址
- ioctl获取本地IP和MAC地址
- VC获取本机IP、子网掩码、网关、计算广播地址等信息代码(通过读注册表)
- 获取WIFI连接下的广播地址 子网掩码 IP地址
- 获取WIFI连接下的广播地址 子网掩码 IP地址
- linux 利用ioctl函数获取IP地址、子网掩码、MAC地址和修改本机IP地址、子网掩码、网关
- ioctl获取本地IP
- 通过socket获取ip地址
- linux limits.conf实验
- Spring源码分析【3】-SpingWebInitializer的加载
- Android BLE Beacon的探索
- 管理修改
- 如何发现优秀的开源项目?
- socket 通过 ioctl获取 设置 网卡 IP 子网掩码 本地广播地址
- POJ-2251 Dungeon Master
- Storage Options
- postman断言解析
- 热力学与图像处理
- Android异常总结
- CTDB运行调试
- opencv版本记录
- UVA 11624 Fire!【BFS】