麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

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

千鋒教育

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

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

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

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

深入了解getifaddrs函數(shù)

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

一、getifaddrs簡介

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


struct ifaddrs {
    struct ifaddrs  *ifa_next;         /* 下一個地址 */
    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、定義一個ifaddrs類型指針,用于存儲指向設(shè)備地址列表的第一個元素的指針。

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

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

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

三、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;

    /* 顯示地址族(針對IPV4和IPV6),IPV4地址和端口號,IPV6地址和端口號,并將地址存儲在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;
        }

        /* 記錄最大的文件描述符號碼 */
        max_fds = MAX(max_fds, sockfd);
    }

    /* free the list */
    freeaddrinfo(servinfo);
}

freeifaddrs(ifaddr);

四、Getifaddrs崩潰

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

1、內(nèi)存泄漏

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

2、緩沖區(qū)溢出

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

結(jié)論

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

tags: gmpy2
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(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
主站蜘蛛池模板: 亚洲精品国产v片在线观看| 日韩av片无码一区二区不卡电影| 日韩伦理片电影在线免费观看 | 久久久99精品免费观看| 精品国产福利一区二区| 国产三级在线观看视频不卡| 日本年轻的妈妈| 中文字幕在线高清| 欧美综合自拍亚洲综合图片区| 韩国女主播一区二区| 青青青国产免费线在| 男人桶女人视频不要下载| 国产一区二区三区小向美奈子| 日本特黄特黄刺激大片| 快点使劲舒服爽视频| chinese猛攻打桩机体育生| 国产精品怡红院在线观看| 中文字幕无线码中文字幕免费| 在公车上被一个接一个| 日韩日韩日韩日韩日韩| 精品国产污污免费网站入口| 伦之荡艳岳| 国产真乱全集mangent| 午夜dj在线观看免费视频| 国产成人精品久久综合| 欧美夫妇交换俱乐部在线观看| а√在线地址最新版| 水蜜桃视频在线免费观看| 久久精品国产欧美日韩| 毛片日韩| 亚洲一级影片| 又黄又粗又爽免费观看| 欧美日韩无线码在线观看| 国产人妖ts在线观看免费视频| 性生活大片免费观看| 久久久久九九精品影院| 欧美一区二区影院| 久久免费视频一区| 国产91在线|欧美| 国产精品亚洲精品日韩已满| 无码日韩精品一区二区免费|