#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/ioctl.h> 
#include <net/if.h> 
#include <arpa/inet.h> 
#include <linux/netlink.h> 
#include <linux/rtnetlink.h> 
 
// 获取IP地址,子网掩码,MAC地址 
int GetLocalNetInfo( 
    const char* lpszEth, 
    char* szIpAddr, 
    char* szNetmask, 
    char* szMacAddr 


    int ret = 0; 
 
    struct ifreq req; 
    struct sockaddr_in* host = NULL; 
 
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if ( -1 == sockfd ) 
    { 
        return -1; 
    } 
 
    bzero(&req, sizeof(struct ifreq)); 
    strcpy(req.ifr_name, lpszEth); 
    if ( ioctl(sockfd, SIOCGIFADDR, &req) >= 0 ) 
    { 
        host = (struct sockaddr_in*)&req.ifr_addr; 
        strcpy(szIpAddr, inet_ntoa(host->sin_addr)); 
    } 
    else 
    { 
        ret = -1; 
    } 
 
    bzero(&req, sizeof(struct ifreq)); 
    strcpy(req.ifr_name, lpszEth); 
    if ( ioctl(sockfd, SIOCGIFNETMASK, &req) >= 0 ) 
    { 
        host = (struct sockaddr_in*)&req.ifr_addr; 
        strcpy(szNetmask, inet_ntoa(host->sin_addr)); 
    } 
    else 
    { 
        ret = -1; 
    } 
 
    bzero(&req, sizeof(struct ifreq)); 
    strcpy(req.ifr_name, lpszEth); 
    if ( ioctl(sockfd, SIOCGIFHWADDR, &req) >= 0 ) 
    { 
        sprintf( 
            szMacAddr, "%02x:%02x:%02x:%02x:%02x:%02x", 
            (unsigned char)req.ifr_hwaddr.sa_data[0], 
            (unsigned char)req.ifr_hwaddr.sa_data[1], 
            (unsigned char)req.ifr_hwaddr.sa_data[2], 
            (unsigned char)req.ifr_hwaddr.sa_data[3], 
            (unsigned char)req.ifr_hwaddr.sa_data[4], 
            (unsigned char)req.ifr_hwaddr.sa_data[5] 
        ); 
    } 
    else 
    { 
        ret = -1; 
    } 
 
    if ( sockfd != -1 ) 
    { 
        close(sockfd); 
        sockfd = -1; 
    } 
 
    return ret; 

 
// ------------------------------------------------------ 
 
#define BUFSIZE 8192 
 
struct route_info  

    char ifName[IF_NAMESIZE]; 
    u_int gateWay; 
    u_int srcAddr; 
    u_int dstAddr; 
}; 
 
static int ReadNlSock( 
    int sockFd, 
    char* bufPtr, 
    int seqNum, 
    int pId 


    struct nlmsghdr* nlHdr = NULL; 
    int readLen = 0, msgLen = 0; 
 
    while (true) 
    { 
        if ( (readLen = recv(sockFd, bufPtr, BUFSIZE - msgLen, 0)) < 0 ) 
        { 
            return -1; 
        } 
 
        nlHdr = (struct nlmsghdr *)bufPtr; 
 
        if ( (NLMSG_OK(nlHdr, (unsigned int)readLen) == 0) 
                || (nlHdr->nlmsg_type == NLMSG_ERROR) ) 
        { 
            return -1; 
        } 
 
        if ( nlHdr->nlmsg_type == NLMSG_DONE ) 
        { 
            break; 
        } 
        else 
        { 
            bufPtr += readLen; 
            msgLen += readLen; 
        } 
 
        if ( (nlHdr->nlmsg_flags & NLM_F_MULTI) == 0 ) 
        { 
            break; 
        } 
 
        if ( (nlHdr->nlmsg_seq != (unsigned int)seqNum) 
                || (nlHdr->nlmsg_pid != (unsigned int)pId) ) 
        { 
            break; 
        } 
    } 
 
    return msgLen; 

 
static int ParseRoutes( 
    struct nlmsghdr* nlHdr, 
    struct route_info* rtInfo, 
    char* default_gateway 


    int rtLen = 0; 
    struct in_addr dst; 
    struct in_addr gate; 
    struct rtmsg* rtMsg = NULL; 
    struct rtattr* rtAttr = NULL; 
 
    rtMsg = (struct rtmsg*)NLMSG_DATA(nlHdr); 
 
    if ( (rtMsg->rtm_family != AF_INET) 
            || (rtMsg->rtm_table != RT_TABLE_MAIN) ) 
    { 
        return -1; 
    } 
 
    rtAttr = (struct rtattr*)RTM_RTA(rtMsg); 
    rtLen = RTM_PAYLOAD(nlHdr); 
    for ( ; RTA_OK(rtAttr, rtLen); rtAttr = RTA_NEXT(rtAttr, rtLen) ) 
    { 
        switch (rtAttr->rta_type) 
        { 
        case RTA_OIF: 
            if_indextoname(*(int*)RTA_DATA(rtAttr), rtInfo->ifName); 
            break; 
        case RTA_GATEWAY: 
            rtInfo->gateWay = *(u_int*)RTA_DATA(rtAttr); 
            break; 
        case RTA_PREFSRC: 
            rtInfo->srcAddr = *(u_int*)RTA_DATA(rtAttr); 
            break; 
        case RTA_DST: 
            rtInfo->dstAddr = *(u_int*)RTA_DATA(rtAttr); 
            break; 
        } 
    } 
 
    dst.s_addr = rtInfo->dstAddr; 
    if (strstr((char*)inet_ntoa(dst), "0.0.0.0")) 
    { 
        gate.s_addr = rtInfo->gateWay; 
        strcpy(default_gateway, (char*)inet_ntoa(gate)); 
    } 
 
    return 0; 

 
// 获取默认网关 
int GetDefaultGateway( 
    const char* lpszEth, 
    char* szDefaultGateway 


    static char szGatewayTemp[32] = {0}; 
    static char msgBuf[BUFSIZE] = {0}; 
    static struct route_info ri; 
 
    int ret = -1; 
 
    struct nlmsghdr* nlMsg = NULL; 
    struct rtmsg* rtMsg = NULL; 
    struct route_info* rtInfo = &ri; 
 
    int len = 0, msgSeq = 0; 
 
    int sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE); 
    if ( -1 == sock ) 
    { 
        goto END; 
    } 
 
    nlMsg = (struct nlmsghdr*)msgBuf; 
    rtMsg = (struct rtmsg*)NLMSG_DATA(nlMsg); 
 
    nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); 
    nlMsg->nlmsg_type = RTM_GETROUTE; 
    nlMsg->nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST; 
    nlMsg->nlmsg_seq = msgSeq++; 
    nlMsg->nlmsg_pid = getpid(); 
 
    if ( send(sock, nlMsg, nlMsg->nlmsg_len, 0) < 0 ) 
    { 
        goto END; 
    } 
 
    if ( (len = ReadNlSock(sock, msgBuf, msgSeq, getpid())) < 0 ) 
    { 
        goto END; 
    } 
 
    if ( rtInfo != NULL ) 
    { 
        for ( ; NLMSG_OK(nlMsg, (unsigned int)len); nlMsg = NLMSG_NEXT(nlMsg, len) ) 
        { 
            memset(szGatewayTemp, 0, 64); 
            memset(rtInfo, 0, sizeof(struct route_info)); 
            if ( 0 == ParseRoutes(nlMsg, rtInfo, szGatewayTemp) ) 
            { 
                if ( strcmp(rtInfo->ifName, lpszEth) == 0 
                        && strcmp(szGatewayTemp, "0.0.0.0") != 0 
                        && strlen(szGatewayTemp) > 0 ) 
                { 
                    strcpy(szDefaultGateway, szGatewayTemp); 
                    ret = 0; 
                }  
            } 
        } 
    } 
 
END: 
 
    if ( sock != -1 ) 
    { 
        close(sock); 
        sock = -1; 
    } 
 
    return ret; 

 
// ------------------------------------------------------ 
 
// 设置IP地址和子网掩码 
int SetLocalNetInfo( 
    const char* lpszEth, 
    const char* lpszIpAddr, 
    const char* lpszNetmask 


    int ret = -1; 
 
    struct ifreq req; 
    struct sockaddr_in* host = NULL; 
 
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if ( -1 == sockfd ) 
    { 
        goto END; 
    } 
 
    bzero(&req, sizeof(struct ifreq)); 
    strcpy(req.ifr_name, lpszEth); 
    host = (struct sockaddr_in*)&req.ifr_addr; 
    host->sin_family = AF_INET; 
    if ( 1 != inet_pton(AF_INET, lpszIpAddr, &(host->sin_addr)) ) 
    { 
        goto END; 
    } 
    if ( ioctl(sockfd, SIOCSIFADDR, &req) < 0 ) 
    { 
        goto END; 
    } 
 
    bzero(&req, sizeof(struct ifreq)); 
    strcpy(req.ifr_name, lpszEth); 
    host = (struct sockaddr_in*)&req.ifr_addr; 
    host->sin_family = AF_INET; 
    if ( 1 != inet_pton(AF_INET, lpszNetmask, &(host->sin_addr)) ) 
    { 
        goto END; 
    } 
    if ( ioctl(sockfd, SIOCSIFNETMASK, &req) < 0 ) 
    { 
        goto END; 
    } 
 
    ret = 0; 
 
END: 
 
    if ( sockfd != -1 ) 
    { 
        close(sockfd); 
        sockfd = -1; 
    } 
 
    return ret; 

 
// 设置指定网口的mtu值 
int SetMTU(const char* lpszEth, unsigned int mtu) 

    int ret = -1; 
 
    struct ifreq ifr; 
 
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if ( -1 == sockfd ) 
    { 
        goto END; 
    } 
 
    strcpy(ifr.ifr_name, lpszEth); 
    ifr.ifr_ifru.ifru_mtu = mtu; 
    if ( ioctl(sockfd, SIOCSIFMTU, &ifr) < 0 ) 
    { 
        goto END; 
    } 
 
    ret = 0; 
 
END: 
 
    if ( sockfd != -1 ) 
    { 
        close(sockfd); 
        sockfd = -1; 
    } 
 
    return ret; 

 
// 关闭指定网口 
int SetIfDown(const char* lpszEth) 

    int ret = -1; 
 
    struct ifreq ifr; 
 
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if ( -1 == sockfd ) 
    { 
        goto END; 
    } 
 
    strcpy(ifr.ifr_name, lpszEth); 
 
    if ( ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0 ) 
    { 
        goto END; 
    } 
 
    ifr.ifr_flags &= ~IFF_UP; 
 
    if ( ioctl(sockfd, SIOCSIFFLAGS, &ifr) < 0 ) 
    { 
        goto END; 
    } 
 
    ret = 0; 
 
END: 
 
    if ( sockfd != -1 ) 
    { 
        close(sockfd); 
        sockfd = -1; 
    } 
 
    return ret; 

 
// 打开指定网口 
int SetIfUp(const char* lpszEth) 

    int ret = -1; 
 
    struct ifreq ifr; 
 
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if ( -1 == sockfd ) 
    { 
        goto END; 
    } 
 
    strcpy(ifr.ifr_name, lpszEth); 
 
    if ( ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0 ) 
    { 
        goto END; 
    } 
 
    ifr.ifr_flags |= IFF_UP; 
 
    if ( ioctl(sockfd, SIOCSIFFLAGS, &ifr) < 0 ) 
    { 
        goto END; 
    } 
 
    ret = 0; 
 
END: 
 
    if ( sockfd != -1 ) 
    { 
        close(sockfd); 
        sockfd = -1; 
    } 
 
    return ret; 

 
小记:前端时间因为需要在Linux下获取和设置网络信息,所以就简单的学习了一下,写出了以上的几个工具函数。最开始是用了一种比较土的方式,就是通过system函数执行命令,然后命令是通过调用ifconfig这个程序来到达设置网络信息的目的,但是感觉很别扭,还是应该使用相应的API比较好,但是又没有找到Linux有对应的API,上网查也似乎没能找到什么比较好的现成函数,所以最后只好自己写了

Linux下通过ioctl系统调用来获取和设置网络信息的更多相关文章

  1. Linux下利用ioctl函数获取网卡信息

    linux下的ioctl函数原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv ...

  2. Linux下Wireshark普通用户不能获取网络接口问题

    Linux下Wireshark普通用户不能获取网络接口问题 1.安装setcap, setcap 是libcap2-bin包的一部分,一般来说,这个包默认会已经装好. sudo apt-get ins ...

  3. linux下的CPU、内存、IO、网络的压力测试

    linux下的CPU.内存.IO.网络的压力测试  要远程测试其实很简单了,把结果放到一个微服务里直接在web里查看就可以了,或者同步到其他服务器上 一.对CPU进行简单测试: 1.通过bc命令计算特 ...

  4. [转帖]linux下的CPU、内存、IO、网络的压力测试

    linux下的CPU.内存.IO.网络的压力测试 https://www.cnblogs.com/zhuochong/p/10185881.html 一.对CPU进行简单测试: 1.通过bc命令计算特 ...

  5. linux下生成core dump文件方法及设置

    linux下生成core dump文件方法及设置    from:http://www.cppblog.com/kongque/archive/2011/03/07/141262.html core ...

  6. 详解Linux下iptables中的DNAT与SNAT设置(转)

    详解Linux下iptables中的DNAT与SNAT设置 这篇文章主要介绍了Linux下iptables中的DNAT与SNAT设置,是Linux网络配置中的基础知识,需要的朋友可以参考下   原文连 ...

  7. Linux下Tomcat端口、进程以及防火墙设置

     Linux下Tomcat端口.进程以及防火墙设置 1,查看tomcat进程: #ps -aux | grep tomcat(或者ps -ef | grep tomcat都行) 可以看到现在运行着两个 ...

  8. 转:Linux下同时启动两个Tomcat进行设置

    转: Linux下同时启动两个Tomcat进行设置 解压tar.gz:tar -zxvf apache-tomcat-6.0.41.tar.gz 至相应的路径下,可解压至两个不同的路径或者相同的路径下 ...

  9. Qt5获取本机网络信息

    获取本机网络信息 在pro文件中加入如下代码 QT += network widget.h中的代码如下 #ifndef WIDGET_H #define WIDGET_H #include <Q ...

随机推荐

  1. React vs Angular 2: 冰与火之歌

    黄玄 · 3 个月前 本文译自 Angular 2 versus React: There Will Be Blood ,其实之前有人翻译过,但是翻得水平有一点不忍直视,我们不希望浪费这篇好文章. 本 ...

  2. POJ3083Children of the Candy Corn

    题意:给你一个迷宫,入口处标为S,出口处标为E,可以走的地方为“.”,不可以走的地方为#,求左转优先时从出口到入口的路程,再求右转优先时,出口到入口的路程,最后求从出口到入口的最短路程. 思路:求前两 ...

  3. 使用wget和ftp共享文件

    一.需求 有一个机器A,上面那有很多文件.现在新买一个机器B,不想用U盘复制,就想把A弄成个服务器,然后B登录到A,想要什么文件就下载什么文件. 二.Win7实现 A是Win7和Ubuntu双系统,首 ...

  4. Mysql 分页语句Limit用法

    转载自:http://qimo601.iteye.com/blog/1634748 1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用 ...

  5. JAVA! static什么作用?

    是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...

  6. java--依赖、关联、聚合和组合之间区别的理解

    在学习面向对象设计对象关系时,依赖.关联.聚合和组合这四种关系之间区别比较容易混淆.特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境.特定情景等. 依赖(Dependency)关系是类与 ...

  7. JavaWeb项目开发案例精粹-第3章在线考试系统-007View层

    0.login.jsp <%@ page language="java" import="java.util.*" pageEncoding=" ...

  8. swift:类型转换(is用作判断检测、as用作类型向下转换)

    类型转换是一种检查类实例的方式,并且哦或者也是让实例作为它的父类或者子类的一种方式.   类型转换在Swift中使用is 和 as操作符实现.这两个操作符提供了一种简单达意的方式去检查值的类型或者转换 ...

  9. 转TerreyLee AJAX入门系列2——ScriptManager的理解总结

    ScriptManager的功能之一就是处理页面上局部更新,对于这点,我想大家都知道.但是他工作的原理到底是什么呢,这个暂且不从正面来回答. 我们这样想一下,目前能够真正实现局部刷新的就是js+xml ...

  10. 对Memcached使用的总结和使用场景

    1.memcached是什么 Memcached 常被用来加速应用程序的处理,在这里,我们将着重于介绍将它部署于应用程序和环境中的最佳实践.这包括应该存储或不应存储哪些.如何处理数据的灵活分布以 及如 ...