在linux下 获取,修改子网掩码NETMASK的两个函数

本文介绍了一个C++函数用于获取本地计算机的子网掩码,并提供了另一个函数来设置指定接口的子网掩码。这些函数使用了socket编程和ioctl系统调用。

//获取子网掩码的函数QString GetLocalNetMask()  
{  
    int sock_netmask;  
    char netmask_addr[50];  
 
    struct ifreq ifr_mask;  
    struct sockaddr_in *net_mask;  
          
    sock_netmask = socket( AF_INET, SOCK_STREAM, 0 );  
    if( sock_netmask == -1)  
    {  
        perror("create socket failture...GetLocalNetMask/n");  
        return "";  
    }  
      
    memset(&ifr_mask, 0, sizeof(ifr_mask));     
    strncpy(ifr_mask.ifr_name, ifname, sizeof(ifr_mask.ifr_name )-1);     
 
    if( (ioctl( sock_netmask, SIOCGIFNETMASK, &ifr_mask ) ) < 0 )   
    {  
        printf("mac ioctl error/n");  
        return "";  
    }  
      
    net_mask = ( struct sockaddr_in * )&( ifr_mask.ifr_netmask );  
    strcpy( netmask_addr, inet_ntoa( net_mask -> sin_addr ) );  
      
    printf("local netmask:%s/n",netmask_addr);      
      
    close( sock_netmask );  
    return QString( netmask_addr );  

//修改子NETMASK的函数

QString SetLocalNetMask(const char *szNetMask)  
{  
    int sock_netmask;  
    char netmask_addr[32];     
 
    struct ifreq ifr_mask;  
    struct sockaddr_in *sin_net_mask;  
          
    sock_netmask = socket( AF_INET, SOCK_STREAM, 0 );  
    if( sock_netmask == -1)  
    {  
        perror("Not create network socket connect/n");  
        return "";  
    }  
      
    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, szNetMask, &sin_net_mask ->sin_addr);  
 
    if(ioctl(sock_netmask, SIOCSIFNETMASK, &ifr_mask ) < 0)   
    {  
        printf("sock_netmask ioctl error/n");  
        return "";  
    }  

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/davidge333/archive/2010/01/24/5250690.aspx

Linux系统中,使用C语言获取设备的子网掩码可以通过访问网络接口的配置信息来实现。通常,这涉及到使用标准的系统调用和结构体来查询网络接口的状态。以下是具体实现的方法。 ### 获取子网掩码的代码示例 可以使用`ioctl()`函数配合`struct ifreq`结构体来获取网络接口的信息。以下是一个完整的C语言程序示例,展示了如何获取指定网络接口的子网掩码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <net/if.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { int sockfd; struct ifreq ifr; // 检查参数是否正确 if (argc != 2) { fprintf(stderr, "Usage: %s <interface_name>\n", argv[0]); exit(EXIT_FAILURE); } // 创建socket用于ioctl调用 sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); exit(EXIT_FAILURE); } // 设置接口名称 strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1); // 获取接口的IP地址 if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0) { perror("ioctl(SIOCGIFADDR)"); close(sockfd); exit(EXIT_FAILURE); } // 获取子网掩码 if (ioctl(sockfd, SIOCGIFNETMASK, &ifr) < 0) { perror("ioctl(SIOCGIFNETMASK)"); close(sockfd); exit(EXIT_FAILURE); } // 将子网掩码转换为点分十进制格式并输出 struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_netmask; printf("Subnet Mask for interface %s: %s\n", argv[1], inet_ntoa(sin->sin_addr)); // 关闭socket close(sockfd); return 0; } ``` ### 编译与运行 将上述代码保存为文件(例如`get_subnet_mask.c`),然后使用以下命令编译并运行它: ```bash gcc get_subnet_mask.c -o get_subnet_mask ./get_subnet_mask eth0 ``` 请将`eth0`替换为你实际使用的网络接口名称(如`enp0s3`、`wlan0`等)。 ### 工作原理 - **socket()**:创建一个UDP套接字,用于执行`ioctl()`操作。 - **SIOCGIFADDR**:获取指定网络接口的IP地址,确保该接口存在且处于活动状态。 - **SIOCGIFNETMASK**:获取指定网络接口的子网掩码[^4]。 - **inet_ntoa()**:将子网掩码从网络字节序的二进制形式转换为人类可读的点分十进制字符串形式。 ### 注意事项 - 程序需要以root权限运行才能成功调用`ioctl()`函数。 - 如果指定的网络接口不存在或未激活,`ioctl()`会返回错误。 - 子网掩码是以`struct sockaddr_in`结构体的形式返回的,因此需要将其转换为IPv4地址格式进行打印。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值