socket學習 sockAddr t 結構

2021-06-03 01:16:28 字數 1423 閱讀 9529

short int sin_family;   

unsigned short int sin_port;   

truct

in_addr sin_addr;  

unsigned char sin_zero[8];

sin_family指代協議族,在socket程式設計中只能是af_inet   sin_port儲存埠號(使用網路位元組順序)  sin_addr儲存ip位址,使用in_addr這個資料結構  sin_zero是為了讓sockaddr與sockaddr_in兩個資料結構保持大小相同而保留的空位元組。  s_addr按照網路位元組順序儲存ip位址

sockaddr_in和sockaddr是並列的結構,指向sockaddr_in的結構體的指標也可以指向  sockaddr的結構體,並代替它。也就是說,你可以使用sockaddr_in建立你所需要的資訊,

將ip位址轉換成長整型:首先,假設你已經有了乙個sockaddr_in結構體ina,你有乙個ip位址"132.241.5.10"要儲存在其中,你就要用到函式inet_addr(),將ip位址從點數格式轉換成無符號長整型。使用方法如下:ina.sin_addr.s_addr= inet_addr("132.241.5.10");

注意,inet_addr()返回的位址已經是網路位元組格式,所以你無需再呼叫函式htonl()。

我們現在發現上面的**片斷不是十分完整的,因為它沒有錯誤檢查。顯而易見,當inet_addr()發生錯誤時返回-1。記住這些二進位制數字?(無符號數)-1僅僅和ip位址255.255.255.255相符合!但這可是廣播位址!所以,記住要先進行錯誤檢查。

怎樣將乙個in_addr結構體輸出成點數格式?你要用到函式 inet_ntoa()("ntoa"的含義是"network toascii"),就像這樣:printf("%s",inet_ntoa(ina.sin_addr));它將輸出ip位址。需要注意的是inet_ntoa()將結構體in_addr作為乙個引數,不是長整形。同樣需要注意的是它返回的是乙個指向乙個字元的指標。它是乙個由inet_ntoa()控制的靜態的固定的指標,所以每次呼叫inet_ntoa(),它就將覆蓋上次呼叫時所得的ip位址。例如:

char *a1, *a2;

.  .

a1 = inet_ntoa(ina1.sin_addr);

a2 = inet_ntoa(ina2.sin_addr);

printf("address 1: %s ",a1);

printf("address 2: %s ",a2);

輸出如下:

address 1: 132.241.5.10

address 2: 132.241.5.10

假如你需要儲存這個ip位址,使用strcopy()函式來指向你自己的字元指標。

inet_ntoa()

簡述:將網路位址轉換成「.」點隔的字串格式

*/  

socket學習 一 socket模組屬性

屬性名稱 描述資料屬性 af unix af inet af inet6 af netlink af tipc python 中支援的套接字位址家族 so stream so dgram 套接字型別 tcp 流,udp 資料報 has ipv6 指示是否支援 ipv6 的布林標記 異常error 套...

Socket學習筆記

public classsocketextends object 此類實現客戶端套接字 也可以就叫 套接字 套接字是兩台機器之間的通訊端點。套接字的實際工作由socketimpl類的例項執行。應用程式通過更改建立套接字實現的套接字工廠可以配置它自身,以建立適合本地防火牆的套接字。一 建構函式 soc...

socket程式設計學習

socket 也稱作套接字,應用程式通常通過套接字向網路發出請求或者應答網路請求。常用的套接字api函式 1 socket 函式原型為 int socket int domain,int type,int protocol 函式引數說明 domain 為建立的套接字指定協議集,例如 af inet ...