pjlib系列之網路ip helper

2021-09-26 15:54:46 字數 2715 閱讀 2191

本地介面和ip

列舉本地介面和ip在ip_helper.h和ip_helper_generic.c

/**

* enumerate the local ip inte***ces currently active in the host.

* * may specify pj_af_unspec() to retrieve all addresses,

* or pj_af_inet() or pj_af_inet6() to retrieve inte***ces

* with specific address family.

* @param count on input, specify the number of entries. on output,

* it will be filled with the actual number of entries.

* @param ifs array of socket addresses, which address part will

* be filled with the inte***ce address. the address

* family part will be initialized with the address

* family of the ip address.

* */

pj_decl(pj_status_t) pj_enum_ip_inte***ce(int af,

unsigned *count,

pj_sockaddr ifs);

根據編譯選項有4種實現方式:

1、使用getifaddrs

struct ifaddrs   

ifa_ifu;

#define ifa_broadaddr ifa_ifu.ifu_broadaddr

#define ifa_dstaddr ifa_ifu.ifu_dstaddr

void *ifa_data; /* address-specific data */

};freeifaddrs(ifap);

2、使用ifconf和ifreq,再配合ioctrl,這種方式不支援ipv6。

//ifconf通常是用來儲存所有介面資訊的

struct ifconf

ifc_ifcu;

};#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */

#define ifc_req ifc_ifcu.ifcu_req /* array of structures */

//ifreq用來儲存某個介面的資訊

struct ifreq

ifr_ifru;

};#define ifr_addr ifr_ifru.ifru_addr

#define ifr_dstaddr ifr_ifru.ifru_dstaddr

#define ifr_broadaddr ifr_ifru.ifru_broadaddr

1. 先通過ioctl獲得本地所有介面的資訊,並儲存在ifconf

2. 再從ifconf中取出每乙個ifreq中表示ip位址的資訊

具體使用時我們可以認為ifconf就有兩個成員:

ifc_len 和ifc_buf, 如圖一所示:

ifc_len:表示用來存放所有介面資訊的緩衝區長度

ifc_buf:表示存放介面資訊的緩衝區

所以我們需要在程式開始時對ifconf的ifc_len和ifc_buf進行初始化 

接下來使用ioctl獲取所有介面資訊,完成後ifc_len內存放實際獲得的介面資訊總長度

並且資訊被存放在ifc_buf中。 

如下圖示:(假設讀到兩個介面資訊)

ioctrl常用的操作

siocgifconf

siocgifflags

siocgifaddr

siocgifnetmask

3、使用if_nameindex和ifreq

struct if_nameindex

;if_nameindex()

if_freenameindex(if_list)

if_nameindex可以掃瞄所有介面,然後同樣使用ioctrl獲取位址。和2差不多,只不過使用if_nameindex代替ifconf

4、使用pjlib封裝的介面

/* just get one default route */

status = pj_getdefaultipinte***ce(af, &ifs[0]);

python 網路爬蟲 之scrapy系列

網路爬蟲之scrapy系列 scrapy 網路爬蟲 之0 爬蟲與反扒 scrapy網路爬蟲 之一 scrapy框架簡介和基礎應用 scrapy網路爬蟲 之二 持久化操作 scrapy網路爬蟲 之三 遞迴解析和post請求 scrapy網路爬蟲 之四 日誌等級和請求傳參 scrapy網路爬蟲 之五 c...

阿里雲網路系列之經典網路和專有網路

摘要 阿里雲面向客戶提供的網路型別服務有經典網路和專有網路兩種,但這兩者有什麼區別呢?阿里官網給的解釋是 經典網路 ip位址由阿里雲統一分配,配置簡便,使用方便,適合對操作易用性要求比較高 需要快速使用 ecs 的使用者。阿里雲面向客戶提供的網路型別服務有經典網路和專有網路兩種,但這兩者有什麼區別呢...

linux網路程式設計系列之connect函式詳解

在講解套接字程式設計函式之前,有必要對socket程式設計的兩個不可或缺的結構體進行說明。includestruct sockaddr 由於歷史的原因,套接字函式中 如connect,bind等 使用的引數型別大多是sockaddr型別的。而如今進行套接字程式設計的時候大都使用sockaddr in...