為什麼使用getaddrinfo()函式

2021-08-28 19:56:38 字數 1240 閱讀 5057

在ipv6的應用中getaddrinfo()是很常見的,最常見的形式是:

addrinfo hints;

addrinfo *res = null;

memset(&hints,0,sizeof(hints));

hints.ai_family=af_inet6;

hints.ai_socktype=sock_dgram;

hints.ai_protocol=ipproto_udp;

hints.ai_flags=ai_numerichost;

int rc=getaddrinfo((lpctstr)"2001:da8:6000:291:21f:d0ff:fed4:928c","6000",&hints,&res);

我們需要的變數是「addrinfo *res」,而hints只是乙個中間過程而已。但仔細觀察下,我們會發現,相比於hints變數,res也只是增加了ip位址和埠資訊而已,並沒有其他更多的資訊加入。這時候便會有人有疑問:「為什麼不像變數hints一樣,直接把ip位址和埠直接指定呢?為什麼非要繞個彎彎呢?」其實,我在最開始的時候也存在這樣的疑問,下面讓我們在看一下res在後續程式中被用到的地方。

socket socksrv=socket(res->ai_family, res->ai_socktype, res->ai_protocol);
但這裡貌似沒什麼特別的(相比於hints而言)。

接著看,

int ret = bind(socksrv, res->ai_addr, res->ai_addrlen);

char bufsend[50] = "safasf";

rc=sendto(sockclt, bufsend, 4, 0, res->ai_addr,res->ai_addrlen);

注意這裡的res->ai_addrlen。這個變數代表位址長度。是在getaddrinfo()函式中自動獲得的(當然這個我們也可以自己指定)。

看到這裡,應用getaddrinfo()函式的原因已經很明顯了-簡化res變數的初始化。老實講,資料型別addrinfo還是有點小複雜的(有興趣可以研究下),如果每乙個內部資料成員都要考慮初始化,還是相對麻煩的。所以,這裡引入getaddrinfo()函式,使得addrinfo res的初始化變得清晰而簡單。

需要補充的是,getaddrinfo()函式的用途也不只限於此的,至少它的本意是獲得所有符合條件的addrinfo型別列表的。

為什麼使用 DOCTYPE html

a doctype is a mostly useless,but required,header.html5 spec 現在的各種web開發工具都足夠強大,支援插入模板 因此你並不需要把這又長又臭的doctype乙個個字母的敲出來。doctype最大的作用是讓瀏覽器用來選擇渲染模式,或者說是用來觸...

為什麼使用指標

在實際程式設計中,既然使用變數就可以訪問資料,為什麼還用指標呢?使用指標來操縱自動變數的唯一原因是,為了說明指標的工作原理。指標真正的用途是被用於完成下列3種任務 管理自由儲存區中的資料 訪問類的成員資料和函式 按引用傳遞引數 在 函式的 工作原理 中,提到了5個記憶體區域 全域性命名空間 自由儲存...

為什麼使用Servlet amp JSP

web伺服器接收客戶請求,查詢資源,然後向客戶返回一些結果。web客戶允許使用者請求伺服器上的某個資源,並且向使用者顯示請求的結果。客戶和伺服器使用http協議進行通訊,伺服器使用http向客戶傳送html。tcp協議負責確保從乙個網路節點向另乙個網路節點傳送的檔案能作為乙個完整的檔案到達目的地,i...