linux 工具函數(shù)之網(wǎng)絡(luò)工具函數(shù)

**本地IP珠洗、子網(wǎng)掩碼种樱、網(wǎng)關(guān)、MAC地址 獲取方法 **

#include <stdio.h>      
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h> 
#include <string.h> 
#include <arpa/inet.h>
#include <net/if.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <linux/sockios.h>
char* getLocalIp( )  
{  
    int sock_get_ip;  
    char ipaddr[50];  
  
    struct   sockaddr_in *sin;  
    struct   ifreq ifr_ip;     
  
    if ((sock_get_ip=socket(AF_INET, SOCK_STREAM, 0)) == -1)  
    {  
         printf("socket create failse...GetLocalIp!\n");  
         return NULL;  
    }  
     
    memset(&ifr_ip, 0, sizeof(ifr_ip));    
    //指定網(wǎng)卡為 eth0 
    strncpy(ifr_ip.ifr_name, "eth0", sizeof(ifr_ip.ifr_name) - 1);     
   
    if( ioctl( sock_get_ip, SIOCGIFADDR, &ifr_ip) < 0 )     
    {     
         return NULL;     
    }       
    sin = (struct sockaddr_in *)&ifr_ip.ifr_addr;     
    strcpy(ipaddr,inet_ntoa(sin->sin_addr));         
    
    printf("local net adapter:[ %-5s ] ip_v4 [ %-20s ]\n", "eth0", ipaddr);    
    close( sock_get_ip );  
      
    return NULL;  
}  
void getlocalIp2()
{
    struct ifaddrs * ifAddrStruct=NULL;  
    void * tmpAddrPtr=NULL;  
  
    getifaddrs(&ifAddrStruct);  
  
   //獲取所有網(wǎng)卡的ip
    while (ifAddrStruct!=NULL)   
    {  
        if (ifAddrStruct->ifa_addr->sa_family==AF_INET)  
        {   // check it is IP4  
            // is a valid IP4 Address  
            tmpAddrPtr = &((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;  
            char addressBuffer[INET_ADDRSTRLEN];  
            inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);  
            printf("local net adapter:[ %-5s ] ip_v4 [ %-20s ]\n", ifAddrStruct->ifa_name, addressBuffer);   
        }  
        else if (ifAddrStruct->ifa_addr->sa_family==AF_INET6)  
        {   // check it is IP6  
            // is a valid IP6 Address  
            tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;  
            char addressBuffer[INET6_ADDRSTRLEN];  
            inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);  
            printf("local net adapter:[ %-5s ] ip_v6 [ %-20s ]\n", ifAddrStruct->ifa_name, addressBuffer);   
        }   
        ifAddrStruct = ifAddrStruct->ifa_next;  
    }  
    return 0; 
}
int SetLocalIp( const char *ipaddr )  
{  
  
    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 -1;  
  
    if(sock_set_ip = socket( AF_INET, SOCK_STREAM, 0 ) == -1);  
    {  
        perror("socket create failse...SetLocalIp!\n");  
        return -1;  
    }  
   
    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 -1;  
    }  
  
    //設(shè)置激活標志  
    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 -1;  
    }  
  
    close( sock_set_ip );  
    return 0;  
}  
void 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));    

    /* 獲取指定網(wǎng)卡的子網(wǎng)掩碼 */
    strncpy(ifr_mask.ifr_name, "eth0", 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 net adapter:[ %-5s ] mask  [ %-20s ]\n","eth0",netmask_addr);      
      
    close( sock_netmask );  
    return ;  
}
void getLocalMac()  
{  
    int sock_mac;  
      
    struct ifreq ifr_mac;  
    char mac_addr[30];     
      
    sock_mac = socket( AF_INET, SOCK_STREAM, 0 );  
    if( sock_mac == -1)  
    {  
        perror("create socket falise...mac\n");  
        return ;  
    }  
      
    memset(&ifr_mac,0,sizeof(ifr_mac));     
    strncpy(ifr_mac.ifr_name, "eth0", sizeof(ifr_mac.ifr_name)-1);     
  
    if( (ioctl( sock_mac, SIOCGIFHWADDR, &ifr_mac)) < 0)  
    {  
        printf("mac ioctl error\n");  
        return ;  
    }  
      
    sprintf(mac_addr,"%02x%02x%02x%02x%02x%02x",  
            (unsigned char)ifr_mac.ifr_hwaddr.sa_data[0],  
            (unsigned char)ifr_mac.ifr_hwaddr.sa_data[1],  
            (unsigned char)ifr_mac.ifr_hwaddr.sa_data[2],  
            (unsigned char)ifr_mac.ifr_hwaddr.sa_data[3],  
            (unsigned char)ifr_mac.ifr_hwaddr.sa_data[4],  
            (unsigned char)ifr_mac.ifr_hwaddr.sa_data[5]);  
  
    printf("local net adapter:[ %-5s ] mac   [ %-20s ]\n","eth0",mac_addr);      
      
    close( sock_mac );  
    return ;  
}   
void getGateWay()  
{  
    FILE *fp;  
    char buf[512];  
    char cmd[128];  
    char gateway[30];  
    char *tmp;  
  
    strcpy(cmd, "ip route");  
    fp = popen(cmd, "r");  
    if(NULL == fp)  
    {  
        perror("popen error");  
        return ;  
    }  
    while(fgets(buf, sizeof(buf), fp) != NULL)  
    {  
        tmp =buf;  
        while(*tmp && isspace(*tmp))  
            ++ tmp;  
        if(strncmp(tmp, "default", strlen("default")) == 0)  
            break;  
    }  
    sscanf(buf, "%*s%*s%s", gateway);         
    printf("default gateway:%s\n", gateway);  
    pclose(fp);  
      
    return ;  
}  
void main( )
{
    getLocalIp( ) ;
    getlocalIp2( );
    getLocalNetMask();
    getLocalMac();
    getGateWay();
}

運行結(jié)果:

net.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舶得,一起剝皮案震驚了整個濱河市尝抖,隨后出現(xiàn)的幾起案子懊昨,更是在濱河造成了極大的恐慌窄潭,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酵颁,死亡現(xiàn)場離奇詭異嫉你,居然都是意外死亡,警方通過查閱死者的電腦和手機躏惋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門均抽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人其掂,你說我怎么就攤上這事×视” “怎么了款熬?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長攘乒。 經(jīng)常有香客問我贤牛,道長,這世上最難降的妖魔是什么则酝? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任殉簸,我火速辦了婚禮闰集,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘般卑。我一直安慰自己武鲁,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布蝠检。 她就那樣靜靜地躺著沐鼠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叹谁。 梳的紋絲不亂的頭發(fā)上饲梭,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音焰檩,去河邊找鬼憔涉。 笑死,一個胖子當著我的面吹牛析苫,可吹牛的內(nèi)容都是我干的兜叨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼藤违,長吁一口氣:“原來是場噩夢啊……” “哼浪腐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起顿乒,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤议街,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后璧榄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體特漩,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年骨杂,在試婚紗的時候發(fā)現(xiàn)自己被綠了涂身。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡搓蚪,死狀恐怖蛤售,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妒潭,我是刑警寧澤悴能,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站雳灾,受9級特大地震影響漠酿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谎亩,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一炒嘲、第九天 我趴在偏房一處隱蔽的房頂上張望宇姚。 院中可真熱鬧,春花似錦夫凸、人聲如沸浑劳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呀洲。三九已至,卻和暖如春啼止,著一層夾襖步出監(jiān)牢的瞬間道逗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工献烦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滓窍,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓巩那,卻偏偏與公主長得像吏夯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子即横,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 名詞延伸 通俗的說,域名就相當于一個家庭的門牌號碼页藻,別人通過這個號碼可以很容易的找到你桨嫁。如果把IP地址比作一間房子...
    楊大蝦閱讀 20,590評論 2 57
  • 序 計算機網(wǎng)絡(luò)學習的核心內(nèi)容就是網(wǎng)絡(luò)協(xié)議的學習。網(wǎng)絡(luò)協(xié)議是為計算機網(wǎng)絡(luò)中進行數(shù)據(jù)交換而建立的規(guī)則份帐、標準或者說是約定...
    鄭在學_blog閱讀 719評論 0 0
  • 第二章 物理層 頻分復(fù)用:頻分復(fù)用的用戶在同樣的時間占用不同的帶寬資源(頻率帶寬) 時分復(fù)用:時分復(fù)用的用戶在不同...
    PramaWells閱讀 3,587評論 1 3
  • 1. 基礎(chǔ)知識 1.1 3種常見的計算機體系結(jié)構(gòu)劃分 OSI分層(7層):物理層璃吧、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層废境、傳輸層畜挨、會話...
    Mr希靈閱讀 19,852評論 6 120
  • 連日來,大人孩子約好了似的一起感冒噩凹。胸腔深處咳得是尖銳的疼朦促,不敢硬抗了。藥物下栓始,日更眼看成了隔日更,意興闌珊了不少...
    蝸牛0718閱讀 212評論 1 1