網路套接字程式設計基礎

2021-08-21 14:11:33 字數 1328 閱讀 1964

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 **argv)

題外話,兩個函式 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網路程式設計》 

網路基礎 網路程式設計套接字

埠號 port 是傳輸層協議的內容,標示了這台機器上唯一的程序。為什麼要有套接字,舉個例子 郵寄一封信,我們不僅需要知道郵編號碼,還需要知道收件人的門牌號,而此處的郵編號相當於ip位址,而埠號就相當於門牌號。我們已經知道,記憶體中的多位元組資料相對於記憶體位址有 端和小端之分,磁碟 件中的多位元組資...

UNIX網路程式設計 基礎套接字程式設計

就像 unix網路程式設計 裡面說的,我們可以將tcp的連線看成乙個 系統,那麼我們的套接字位址結構,就是我們的 裡面號碼,和其他能確定我們身份資訊的集合。其中ipv4的,我們已經很熟悉,還有另外的,在ipv6如果系統支援長度字段,那麼sin6 len常值必須定義,在使用這一結構時我們必須分清到底,...

網路套接字程式設計

1。位元組序 小位元組 低位儲存在低位元組 大位元組 低位儲存在高位元組 簡單程式判斷 int islittle 2.hostent結構 struct hostent define h addr h addr list 0 這裡是這個資料結構的詳細資料 struct hostent h name 位...