国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          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)前位置:首頁(yè)  >  技術(shù)干貨  > 深入了解getifaddrs函數(shù)

            深入了解getifaddrs函數(shù)

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

            一、getifaddrs簡(jiǎn)介

            getifaddrs是一種系統(tǒng)級(jí)函數(shù),可用于檢索網(wǎng)絡(luò)接口的地址信息。其定義在ifaddrs.h頭文件中。該函數(shù)通過(guò)動(dòng)態(tài)分配存儲(chǔ)空間來(lái)保存設(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)聽(tīng)客戶端 */
                    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)該注意以下問(wèn)題:

            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避免此問(wèn)題。

            結(jié)論

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

            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