sockaddr與sockaddr in的區別

2021-10-01 15:51:59 字數 1328 閱讀 8389

本文**:

struct sockaddr和struct sockaddr_in這兩個結構體用來處理網路通訊的位址。

struct sockaddr ;
sockaddr_in在標頭檔案#include或#include中定義,該結構體解決了sockaddr的缺陷,把port和addr 分開儲存在兩個變數中,如下:

sin_port和sin_addr都必須是網路位元組序(nbo),一般視覺化的數字都是主機位元組序(hbo)。

二者長度一樣,都是16個位元組,即占用的記憶體大小是一致的,因此可以互相轉化。二者是並列結構,指向sockaddr_in結構的指標也可以指向sockaddr。

sockaddr常用於bind、connect、recvfrom、sendto等函式的引數,指明位址資訊,是一種通用的套接字位址。

sockaddr_in 是internet環境下套接字的位址形式。所以在網路程式設計中我們會對sockaddr_in結構體進行操作,使用sockaddr_in來建立所需的資訊,最後使用型別轉化就可以了。一般先把sockaddr_in變數賦值後,強制型別轉換後傳入用sockaddr做引數的函式:sockaddr_in用於socket定義和賦值;sockaddr用於函式引數。

例子如下:

#include #include #include #include int main(int argc,char **ar**)

題外話,兩個函式 htons() 和 inet_addr()。

htons()作用是將埠號由主機位元組序轉換為網路位元組序的整數值。(host to net)

inet_addr()作用是將乙個ip字串轉化為乙個網路位元組序的整數值,用於sockaddr_in.sin_addr.s_addr。

inet_ntoa()作用是將乙個sin_addr結構體輸出成ip字串(network to ascii)。比如:

printf("%s",inet_ntoa(mysock.sin_addr));
htonl()作用和htons()一樣,不過它針對的是32位的(long),而htons()針對的是兩個位元組,16位的(short)。

與htonl()和htons()作用相反的兩個函式是:ntohl()和ntohs()。

參考:《tcp/ip網路程式設計》

sockaddr與sockaddr in的比較

struct sockaddr sa family是位址家族,一般都是 af 的形式。好像通常大多用的是都是af inet。sa data是14位元組協議位址。此資料結構用做bind connect recvfrom sendto等函式的引數,指明位址資訊。但一般程式設計中並不直接針對此資料結構操作...

sockaddr與sockaddr in結構體簡介

struct sockaddr sa family是位址家族,一般都是 af 的形式。好像通常大多用的是都是af inet。sa data是14位元組協議位址。此資料結構用做bind connect recvfrom sendto等函式的引數,指明位址資訊。但一般程式設計中並不直接針對此資料結構操作...

sockaddr與sockaddr in結構體簡介

struct sockaddr sa family是位址家族,一般都是 af 的形式。好像通常大多用的是都是af inet。sa data是14位元組協議位址。此資料結構用做bind connect recvfrom sendto等函式的引數,指明位址資訊。但一般程式設計中並不直接針對此資料結構操作...