UNIX網絡編程卷一 筆記 第三章 套接字編程簡介

套接字編程簡介

1     套接字地址結構

每個協議族定義的套接字地址結構均以sockaddr_開頭。常用的幾種套接字地址結構:

1.     IPV4:sockaddr_in。

2.     IPV6:sockaddr_in6。

3.     Unix域套接字:sockaddr_un。

4.     數據鏈路:sockaddr_dl。

爲了能讓不同的地址結構使用同一套處理函數,規定了通用套接字地址結構struct sockaddr,使用時需要將實際的指針轉型爲sockaddr指針。因爲POSIX沒有規定必須有sin_len字段,因此在調用時也需要將實際的地址結構的長度傳進去。

sockaddr類結構中的sin_addr和sin_port都以網絡字節序存儲。地址結構本身不在主機間傳遞。

新的sockaddr_storage足以容納系統支持的任何地址結構。

2     地址轉換函數

inet_aton和inet_ntoa用於IPV4的地址的字符串形式和二進制形式間的轉換。inet_addr已被廢棄。inet_ntoa使用了靜態數據,不可重入。

inet_pton和inet_ntop可用於IPV4或IPV6的地址的字符串形式和二進制形式間的轉換。inet_ntop需要調用者自行分配足夠的大小。<netinet/in.h>中定義了INET_ADDRSTRLEN和INET_ADDRSTRLEN6兩個常量,指定了這個大小。推薦新程序用這兩個函數。

字符串形式中不包括端口。

sock_ntop是作者自己實現的一個協議無關的轉換函數,字符串形式中包括端口號。還有一組這樣的自定義的函數,用於簡化代碼。

3     readn、writen和readline函數

字節流套接字上調用read和write輸入或輸出的字節數可能比請求的數量少。read的時候需要讀到返回0纔算結束,write需要寫到全部完成。因此開發readn和writen函數。

面向文本行的函數,如果每字節都調用read,效率非常低;如果使用標準I/O函數,則因爲無法判斷緩衝區中未處理的內容,難以檢查客戶發來的消息的有效性;如果使用自定義的緩衝區函數,緩衝區是可見的,但如select等系統函數仍不可能知道這個內部緩衝區。readn和readline這樣面向緩衝區的函數不能交叉使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章