久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

        手機(jī)站
        千鋒教育

        千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

        千鋒教育

        掃一掃進(jìn)入千鋒手機(jī)站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學(xué)習(xí)站小程序
        隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

        當(dāng)前位置:首頁  >  技術(shù)干貨  > 深入了解getifaddrs函數(shù)

        深入了解getifaddrs函數(shù)

        來源:千鋒教育
        發(fā)布人:xqq
        時(shí)間: 2023-11-24 23:09:21 1700838561

        一、getifaddrs簡(jiǎn)介

        getifaddrs是一種系統(tǒng)級(jí)函數(shù),可用于檢索網(wǎng)絡(luò)接口的地址信息。其定義在ifaddrs.h頭文件中。該函數(shù)通過動(dòng)態(tài)分配存儲(chǔ)空間來保存設(shè)備地址列表。通常情況下,您需要使用freeifaddrs函數(shù)釋放該列表。

        
        struct ifaddrs {
            struct ifaddrs  *ifa_next;         /* 下一個(gè)地址 */
            char            *ifa_name;         /* 名稱,任務(wù)類型,和類型信息 */
            unsigned int     ifa_flags;        /* 屬性 */
            struct sockaddr *ifa_addr;         /* 地址信息 */
            struct sockaddr *ifa_netmask;      /* 網(wǎng)絡(luò)掩碼 */
            union {
                struct sockaddr *ifu_broadaddr;
                             /* 廣播地址 */
                struct sockaddr *ifu_dstaddr;
                             /* 目標(biāo)地址 */
            } ifa_ifu;
        #define              ifa_broadaddr ifa_ifu.ifu_broadaddr
        #define              ifa_dstaddr   ifa_ifu.ifu_dstaddr
            void            *ifa_data;         /* 地址信息 */
        };
        

        二、使用getifaddrs函數(shù)

        下面是使用getifaddrs函數(shù)的基本步驟:

        1、定義一個(gè)ifaddrs類型指針,用于存儲(chǔ)指向設(shè)備地址列表的第一個(gè)元素的指針。

        2、調(diào)用getifaddrs函數(shù),并將指向ifaddrs類型指針的指針傳遞給函數(shù)。

        3、遍歷設(shè)備地址列表,并執(zhí)行所需操作。

        4、最終執(zhí)行freeifaddrs函數(shù),以釋放分配給設(shè)備地址列表的存儲(chǔ)空間。

        三、getifaddrs的特性

        1、獲取網(wǎng)絡(luò)接口信息

        使用getifaddrs函數(shù)可獲取網(wǎng)絡(luò)接口的信息,包括接口名稱、IP地址、子網(wǎng)掩碼等。此外,還可以輕松獲取相關(guān)的網(wǎng)絡(luò)接口的廣播地址和目標(biāo)地址。

        
        struct ifaddrs *ifaddr, *ifa;
        int family, s;
        char host[NI_MAXHOST];
        
        if (getifaddrs(&ifaddr) == -1) {
            perror("getifaddrs");
            exit(EXIT_FAILURE);
        }
        
        for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
            if (ifa->ifa_addr == NULL)
                continue;
        
            family = ifa->ifa_addr->sa_family;
        
            /* 顯示地址族(針對(duì)IPV4和IPV6),IPV4地址和端口號(hào),IPV6地址和端口號(hào),并將地址存儲(chǔ)在host數(shù)組中 */
            if (family == AF_INET || family == AF_INET6) {
                s = getnameinfo(ifa->ifa_addr,
                                (family == AF_INET) ? sizeof(struct sockaddr_in) :
                                                      sizeof(struct sockaddr_in6),
                                host, NI_MAXHOST,
                                NULL, 0, NI_NUMERICHOST);
                if (s != 0) {
                    printf("getnameinfo() failed: %s\n", gai_strerror(s));
                    exit(EXIT_FAILURE);
                }
        
                printf("%s  address: %s\n", ifa->ifa_name, host);
            }
        }
        
        freeifaddrs(ifaddr);
        

        2、實(shí)現(xiàn)TCP/IP Server / Client 套接字列表

        使用getifaddrs函數(shù),可以輕松實(shí)現(xiàn)TCP/IP服務(wù)器和客戶端套接字列表。下面是實(shí)現(xiàn)TCP/IP服務(wù)器/客戶端套接字列表的代碼示例。

        
        int sockfd, status, s, max_fds = 0;
        struct addrinfo hints, *servinfo, *p;
        struct ifaddrs *ifaddr, *ifa;
        
        /* 獲取可用地址列表 */
        getifaddrs(&ifaddr);
        
        /* 循環(huán)連接可用地址 */
        for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
            if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET) {
                continue;
            }
        
            /* 定義TCP/IP Socket服務(wù)器地址 */
            memset(&hints, 0, sizeof hints);
            hints.ai_family = AF_INET;          /* IPV4 */
            hints.ai_socktype = SOCK_STREAM;    /* 流套接字(比如TCP) */
            hints.ai_flags = AI_PASSIVE;        /* 意味著底層套接字地址將被用于bind調(diào)用中data */
        
            /* 獲取可用服務(wù)器地址 */
            s = getaddrinfo(NULL, "8080", &hints, &servinfo);
            if (s != 0) {
                fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
                return -1;
            }
        
            /* 循環(huán)連接可用地址 */
            for (p = servinfo; p != NULL; p = p->ai_next) {
                /* 創(chuàng)建TCP/IP Socket */
                sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
                if (sockfd < 0) {
                    continue;
                }
        
                /* 確認(rèn)連接 */
                status = connect(sockfd, p->ai_addr, p->ai_addrlen);
                if (status < 0) {
                    close(sockfd);
                    continue;
                }
        
                /* 監(jiān)聽客戶端 */
                status = listen(sockfd, 10);
                if (status < 0) {
                    close(sockfd);
                    continue;
                }
        
                /* 記錄最大的文件描述符號(hào)碼 */
                max_fds = MAX(max_fds, sockfd);
            }
        
            /* free the list */
            freeaddrinfo(servinfo);
        }
        
        freeifaddrs(ifaddr);
        

        四、Getifaddrs崩潰

        在使用getifaddrs時(shí),一些安全漏洞可能導(dǎo)致崩潰。應(yīng)該注意以下問題:

        1、內(nèi)存泄漏

        必須使用freeifaddrs函數(shù)顯式釋放分配的內(nèi)存。否則可能會(huì)導(dǎo)致內(nèi)存泄漏。

        2、緩沖區(qū)溢出

        緩沖區(qū)溢出是指將輸入數(shù)據(jù)存儲(chǔ)在內(nèi)存緩沖區(qū)之外的情況。這可能導(dǎo)致程序失敗或崩潰??梢允褂胠wip中的替代方案lwip_getifaddrs避免此問題。

        結(jié)論

        getifaddrs是一種用于檢索網(wǎng)絡(luò)接口地址信息的系統(tǒng)級(jí)函數(shù)。通過動(dòng)態(tài)分配存儲(chǔ)空間來保存設(shè)備地址列表。使用該函數(shù),您可以輕松實(shí)現(xiàn)TCP/IP服務(wù)器和客戶端套接字列表、獲取網(wǎng)絡(luò)接口信息等。但是,在使用getifaddrs時(shí),必須注意避免內(nèi)存泄漏和緩沖區(qū)溢出引起的崩潰問題。

        tags: gmpy2
        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
        請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
        免費(fèi)領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學(xué) 138****2860 剛剛成功領(lǐng)取
        王同學(xué) 131****2015 剛剛成功領(lǐng)取
        張同學(xué) 133****4652 剛剛成功領(lǐng)取
        李同學(xué) 135****8607 剛剛成功領(lǐng)取
        楊同學(xué) 132****5667 剛剛成功領(lǐng)取
        岳同學(xué) 134****6652 剛剛成功領(lǐng)取
        梁同學(xué) 157****2950 剛剛成功領(lǐng)取
        劉同學(xué) 189****1015 剛剛成功領(lǐng)取
        張同學(xué) 155****4678 剛剛成功領(lǐng)取
        鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
        董同學(xué) 138****2867 剛剛成功領(lǐng)取
        周同學(xué) 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        北川| 崇左市| 新泰市| 临清市| 六枝特区| 英吉沙县| 辽阳县| 万荣县| 山东省| 榆中县| 永善县| 太仓市| 德江县| 阳曲县| 香河县| 汪清县| 海阳市| 鄂伦春自治旗| 新兴县| 阜南县| 通化县| 焦作市| 安阳市| 海盐县| 庄浪县| 兰坪| 合作市| 孝昌县| 龙门县| 宁晋县| 澎湖县| 克拉玛依市| 望奎县| 沁源县| 乐山市| 安顺市| 怀来县| 曲麻莱县| 宜黄县| 措勤县| 吉林市|