這篇主要是對我前一篇SOCKET網絡編程的拓展。其實再認真看一下,那篇算是我博客裏面比較好的。
補充1:
sockaddr和sockaddr_in的抉擇:
前者是通用的套接字結構體,它可以在不同的協議族之間進行強轉。
後者是以太網中採用的套接字結構體,因爲前面那個不好用。
由於兩個結構體的大小一致,所以進行地址結構設置的時候,通常的方法是使用後者進行配置,然後強制轉換爲前者的結構體類型,這樣不會有任何副作用。
補充2:
以太網中建議使用PF_INET這個域。在程序設計時會發現有的代碼使用的是AF_INET,在頭文件中這兩個值是一致的,我也經常寫AF_INET,不過還是有細微的差別,PF_INET有些協議類型是AF_INET所沒有實現的
補充3:
···
struct sockaddr_in myaddr;
···
bzero(&(my_addr.sin_zero),8);
···
//我個人覺得挺細節的,把預留空間清空
補充4:
函數listen用來初始化服務器可連接隊列。
服務器處理客戶端連接時是順序處理的,同一時間只能處理一個客戶端連接。
當多個客戶端的連接請求同時到來的時候,服務器將不能處理的客戶端連接請求放入到等待隊列中,這個隊列的長度由listen()函數來指定。
大多數系統的設置爲20,其實真的沒必要太多,真的。
根據系統的可承受負載和程序的需求來確定。
系統有一個最大偵聽隊列數,一般是128(somaxconn),可以調優。
補充5:
關閉套接字函數不止一個close,還有shutdown。
int shutdown(int sock,int how);
//該函數用於關閉雙向連接的一部分。
/*
how:
SHUT_RD:值爲0,表示切斷讀
SHUT_WR:值爲1,表示切斷寫
SHUT_RDWR:值爲2,和close功能相同
*/