linux 利用ioctl函数获取IP地址、子网掩码、MAC地址和修改本机IP地址、子网掩码、网关
来源:互联网 发布:淘宝企业店铺不能贷款 编辑:程序博客网 时间:2024/04/28 04:22
ioctl函数原型:
int ioctl(int fd, int request, ..../*void *arg*/)
int fd:为socket函数返回值
int request:SIOCSIFADDR 修改ip地址
SIOCSIFNETMASK 修改子网掩码
SIOCADDRT 修改网关
第三个参数:ip和子网掩码对应的结构体struct ifreq;网关的结构体struct rtentry
//.h
#include <stdlib.h>#include <string.h>#include <pcap.h> #include <sys/types.h>#include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h>#include <netinet/ether.h> #include <net/if.h> #include <arpa/inet.h> #include <net/if_arp.h> #include <sys/ioctl.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <net/route.h>
//.cpp 修改ip地址
bool SetLocalIp(char *ipaddr) { if (NULL == ipaddr) { printf("SetLocalIp: ipaddr is null\n"); return false; } int sock_set_ip; struct sockaddr_in sin_set_ip; struct ifreq ifr_set_ip; bzero( &ifr_set_ip,sizeof(ifr_set_ip)); if( ipaddr == NULL ) return false; if(sock_set_ip = socket(PF_INET, SOCK_STREAM, 0 ) == -1); { perror("socket create failse...SetLocalIp!/n"); return false; } memset( &sin_set_ip, 0, sizeof(sin_set_ip)); strncpy(ifr_set_ip.ifr_name, "eth0", sizeof(ifr_set_ip.ifr_name)-1); sin_set_ip.sin_family = AF_INET; sin_set_ip.sin_addr.s_addr = inet_addr(ipaddr); memcpy( &ifr_set_ip.ifr_addr, &sin_set_ip, sizeof(sin_set_ip)); if( ioctl( sock_set_ip, SIOCSIFADDR, &ifr_set_ip) < 0 ) { perror( "Not setup interface/n"); return false; } ifr_set_ip.ifr_flags |= IFF_UP |IFF_RUNNING; //get the status of the device if( ioctl( sock_set_ip, SIOCSIFFLAGS, &ifr_set_ip ) < 0 ) { perror("SIOCSIFFLAGS"); return false; } close( sock_set_ip); return true; }
//.cpp 修改子网掩码
bool SetLocalNetMask(char *netMask){ int socketfd; if (NULL == netMask) { printf("SetLocalNetMask: netMask is null\n"); return false; } if(socketfd = socket(PF_INET, SOCK_STREAM, 0 ) == -1); { perror("socket create failse...SetLocalNetMask!/n"); return false; } struct ifreq ifr_mask; struct sockaddr_in *sin_net_mask; memset(&ifr_mask, 0, sizeof(ifr_mask)); strncpy(ifr_mask.ifr_name, "eth0", sizeof(ifr_mask.ifr_name) - 1); sin_net_mask = (struct sockaddr_in *)&ifr_mask.ifr_addr; sin_net_mask->sin_family = AF_INET; inet_pton(AF_INET, netMask, &sin_net_mask->sin_addr); if (ioctl(socketfd, SIOCSIFNETMASK, &ifr_mask) < 0) { printf("socket_netmask ioctl error!\n"); return false; } close( socketfd ); return true;}
//.cpp 修改网关
bool SetLocalRoute(char *szGateWay){ int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { return false; } struct rtentry rmten; struct sockaddr_in ic_gateway ;// Gateway IP address int err; memset(&rmten, 0, sizeof(rmten)); ic_gateway.sin_family = AF_INET; ic_gateway.sin_addr.s_addr = inet_addr(szGateWay); ic_gateway.sin_port = 0; ((struct sockaddr_in*)&rmten.rt_dst)->sin_family = AF_INET; ((struct sockaddr_in*)&rmten.rt_dst)->sin_addr.s_addr = 0; ((struct sockaddr_in*)&rmten.rt_dst)->sin_port = 0; ((struct sockaddr_in*)&rmten.rt_genmask)->sin_family = AF_INET; ((struct sockaddr_in*)&rmten.rt_genmask)->sin_addr.s_addr = 0; ((struct sockaddr_in*)&rmten.rt_genmask)->sin_port = 0; memcpy((void *) &rmten.rt_gateway, &ic_gateway, sizeof(ic_gateway)); rmten.rt_flags = RTF_UP | RTF_GATEWAY; if ((err = ioctl(sockfd, SIOCADDRT, &rmten)) < 0) { printf("ioctl net error!\n"); return false; } close( sockfd ); return true;}
//.cpp 获得IP地址、子网掩码、MAC物理地址
bool GetIpMacMaskAddress(){ unsigned char ipaddress[INET_MACADDRESSLEN]; unsigned char macaddress[INET_MACADDRESSLEN]; unsigned char netmask[INET_MACADDRESSLEN]; struct ifreq struReq; memset(&struReq, 0x00, sizeof(struct ifreq)); strncpy(struReq.ifr_name, "eth0", sizeof(struReq.ifr_name)); socketfd = socket(PF_INET, SOCK_STREAM, 0); if (-1 == ioctl(socketfd, SIOCGIFHWADDR, &struReq)) { printf("ioctl hwaddr error!\n"); return false; } strcpy((char *)macaddress, ether_ntoa((ether_addr*)struReq.ifr_hwaddr.sa_data)); if (-1 == ioctl(socketfd, SIOCGIFADDR, &struReq)) { printf("ioctl ip address error!\n"); return false; } strcpy((char *)ipaddress, inet_ntoa(((struct sockaddr_in *)&(struReq.ifr_addr))->sin_addr)); if (-1 == ioctl(socketfd, SIOCGIFNETMASK, &struReq)) { printf("ioctl net mask error!\n"); exit(1); } strcpy((char *)netmask, inet_ntoa(((struct sockaddr_in *)&(struReq.ifr_netmask))->sin_addr)); printf("MacAddress: %s\n", macaddress); printf("IpAddress: %s\n", ipaddress); printf("NetMask: %s\n",netmask); close(socketfd); return true; }
- linux 利用ioctl函数获取IP地址、子网掩码、MAC地址和修改本机IP地址、子网掩码、网关
- IOCTL获取和配置IP地址/子网掩码/网关
- IOCTL获取和配置IP地址/子网掩码/网关
- IP地址,子网掩码和网关
- 获取本机的IP地址、子网掩码、网关
- IP地址、子网掩码、网关
- IP地址、子网掩码、网关
- ip地址 子网掩码 网关
- IP地址 网关 子网掩码
- Mac地址、IP、子网掩码、网关、DNS
- 【网络】Mac地址、IP、子网掩码、网关、DNS
- VC获取IP、子网掩码、网关、广播地址
- IP地址、网关地址、子网掩码地址
- Linux查看网关、子网掩码、IP、广播地址
- IP地址,网关,子网掩码,网段
- IP地址,子网掩码,默认网关
- ip地址,子网掩码,网关,dns
- IP地址,子网掩码,默认网关
- 解决“指定的服务已经标记为删除”问题
- 主键生成策略
- 堆与栈的区别
- java vs javac
- vs2010 断点无效
- linux 利用ioctl函数获取IP地址、子网掩码、MAC地址和修改本机IP地址、子网掩码、网关
- 对Android开发者有益的40条优化建议
- Kriging 插值
- linux 上安装服务程序。
- Java开源报表Jasper入门(1) -- 报表生命周期
- WINCE下ActiveSync连接故障修复办法
- asp 读取查询语句的第一行第一列数据并判断
- Android 内存清理
- 面试总结(一)北京亿信华辰