UNPv1第十一章 高階名字與位址轉換

2021-07-11 10:49:12 字數 2110 閱讀 8710

getaddrinfo函式能夠處理名字到位址以及服務到埠這兩種轉換,返回的是乙個sockaddr結構而不是乙個位址列表,這些sockaddr結構隨後可由套接字函式直接使用

#include 

int getaddrinfo (const

char *hostname, const

char *service, const

struct addrinfo *hints, struct addrinfo **result) ;

//返回:若成功為0,出錯為非0

hostname引數是乙個主機名或位址串,service引數是乙個服務名或十進位制埠字串,本函式通過result指標引數返回乙個指向addrinfo結構鍊錶的指標,而addrinfo結構定義在標頭檔案

struct addrinfo ;
同樣,getaddrinfo函式的引數hints也為型別。hints引數可以的乙個空指標,也可以指向addrinfo結構的指標,呼叫者可在這個結構中填入關於期望返回的資訊型別的暗示。舉例來說,如果指定的服務既支援tcp也支援udp,那麼呼叫者可以把hints結構中的ai_socktype成員設定成sock_dgram使得返回的僅僅是適用於資料報套介面的資訊。

hints結構中呼叫者可以設定的成員有:

ai_flags(零個或多個或在一起的ai_***值)

ai_family(某個af_***值)

ai_socktype(某個sock_***值)

ai_protocol

其中ai_flags成員可用的標誌值及其含義 例如有 ai_passive(套接字將用於被動開啟),ai_canonname(告知getaddrinfo函式返回主機的規範名字)等等

如果本函式返回成功,那麼由result引數指向的變數已被填入乙個指標,它指向的是由其中的ai_next成員串聯起來的addrinfo結構鍊錶。

我們必須先分配乙個hints結構,把它清零後填寫需要的字段,再呼叫getaddrinfo然後遍歷乙個鍊錶逐個嘗試每個返回位址。

函式getaddrinfo返回的所有儲存空間通過呼叫freeaddrinfo返還給系統

#include 

void freeaddrinfo (struct addrinfo *ai);

ai應指向getaddrinfo返回的第乙個addrinfo結構。在該鍊錶中的所有結構,以及這些機構所指向的動態儲存空間都將被釋放。

只複製addrinfo結構,而不複製addrinfo結構所指向的其他結構,叫做淺拷貝或淺複製(shallow copy)。複製addrinfo結構,同時複製addrinfo結構所指向的其他結構,稱為深拷貝或深複製(deep copy)。

#include 

int getnameinfo (const

struct sockaddr *sockaddr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags) ;

//成功為0,出錯為非0(如gai_strerror函式中的表)

sockaddr指向包含協議位址的套介面位址結構,它將會被轉換成可讀的字串,addrlen是結構的長度。這個結構和長度通常由accept, recvfrom, getsockname,getpeername返回

待返回的2個直觀可讀字串由呼叫者預先分配儲存空間,host和hostlen指定主機字串,serv和servlen指定服務字串。如果呼叫者不想返回主機字串或者服務字串,那就指定hostlen或者servlen為0.

sock_ntop和getnameinfo的差別在於,前者不涉及dns,直接返回可輸出的ip位址和埠號,後者通常試圖給主機和服務的名字。

#include "unp.h"

struct addrinfo * host_serv(const

char * hostname, const

char * service ,int family, int socktype);

//返回:成功返回指向addrinfo結構的指標,出錯返回null

UNPv1第十三章 高階IO

涉及套接字上的i o操作設定超時的方法有三種方法 呼叫alarm,在到達指定時間時產生sigalrm訊號 使用select阻塞在等待i o上,select內部有乙個時間限制,以此代替在read或write呼叫上阻塞 使用新的so rcvtimeo和so sndtimeo套接字選項 前兩種技術可以用於...

第十一章程式設計練習 1

list.h pragma once ifndef list h define list h include namespace vector private double x 分量 double y 分量 double mag 需要行走的距離 double ang 角度 move mode rec...

UNPv1第二十一章 帶外資料

帶外資料被認為具有比普遍資料更高的優先順序。帶外資料並不要求在客戶和伺服器之間在使用乙個連線,而是被對映到已有的連線中 tcp沒有真正的帶外資料,而是提供了乙個我們要討論的緊急模式 urgent mode 假設乙個程序已向乙個tcp套介面寫入了n位元組資料,並且這些資料被tcp放入套介面傳送緩衝區等...