套接字編程簡介
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這樣面向緩衝區的函數不能交叉使用。