天天看點

《UNIX網絡程式設計》學習筆記:基本TCP套接字程式設計

1.socket(int family, int type, int protocol);

傳回:若成功則為非負描述符,若出錯則為-1

功能:建立一個未連接配接的套接字

family指明位址協定族,type指明套接字類型,protocol為某個協定類型常值。

《UNIX網絡程式設計》學習筆記:基本TCP套接字程式設計

對比AF_XXX和PF_XXX:AF_字首表示位址族(address family),PF_字首表示協定族(protocol family),曆。史上曾想單個協定族可以支援多個位址族,PF_用來建立套接字,

AF_用于套接字位址結構。但實際上,這樣的協定族未曾實作過,頭檔案中<sys/socket.h>中為給定協定定義的PF_值總是與此協定的AF_值相等。

2.connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);

傳回:若成功則為0,若出錯則為-1

功能:TCP客服用connect函數來建立與TCP伺服器的連接配接。

指針和指針所指向内容的大小都傳遞給核心,于是核心知道到需從程序指派多少資料進來。

傳回錯誤的三種情況:

(1)若TCP客戶沒有收到SYN分節的響應,傳回ETIMEDOUT錯誤;

(2)對客戶的響應是RST,則表明該伺服器主機在我們指定的端口沒有程序在等待與之連接配接,傳回ECONNREFUSED錯誤;

産生RST的三個情況:如前所述;TCP想取消一個已有的連接配接;TCP收到一個根本不存在的連接配接上的分節。

(3)若客戶發出的SYN在中間的某個路由器上引發了一個"destination unreachable"ICMP錯誤,傳回EHOSTUNREACH或ENETUNREACH錯誤給程序。

注意:每次connect失敗後,都必須close目前的套接字描述符并重新調用socket。

3.bind(int sockfd, const struct *myaddr, socklen_t addrlen);

傳回:若成功則為0,若出錯則為-1

功能:bind函數把一個本地協定位址賦予一個套接字,調用bind可以指定IP位址或者端口,可以兩者都指定,也可以都不指定。

(1)端口号:伺服器在啟動的時捆綁它們的端口,如果一個用戶端或伺服器未曾調用bind捆綁一個端口,當調用connect或listen時核心就要為套接字選擇一個臨時端口,

然而這對于TCP伺服器來說極為罕見,且bind不傳回所選擇的值,必須調用getsockname來傳回協定位址。

(2)位址:程序可以把一個特定的IP位址捆綁到它的套接字上,不過這個IP位址必須屬于其所在主機的網絡接口之一;若TCP客戶不捆綁IP位址到套接字上,核心将根據外出網絡接口

選擇源IP位址;若TCP伺服器沒有捆綁位址到套接字上,核心就把客戶發送的SYN的目的位址作為伺服器的源IP位址。

4.listen(int sockfd, int backlog);

傳回:若成功則為0,若出錯則為-1

功能:listen函數僅由TCP伺服器調用,主要完成兩件事:

(1)當socket函數建立一個套接字時預設為主動套接字,即一個客戶将調用connect發起連接配接的客戶套接字,listen函數把這個未連接配接的套接字轉換成一個被動套接字,訓示核心

應接受指向該套接字的連接配接請求;

(2)規定了核心應該為這個套接字排隊的最大連接配接個數。

核心為任何一個監聽套接字維護兩個隊列:未完成連接配接隊列(incomplete connection queue)和已完成連接配接隊列(completed connection queue),listen函數的backlog參數曾經

被規定為這兩個隊列總和的最大值。

(1)未完成連接配接隊列:隊中每一項對應一個由用戶端發出并到達伺服器的SYN分節,而伺服器正在等待完成相應的TCP三路握手過程。

(2)已完成連接配接隊列:隊中每一項對應一個已完成TCP三路握過程的客戶,當調用accept時,已完成連接配接隊列的對頭項将傳回給程序。

《UNIX網絡程式設計》學習筆記:基本TCP套接字程式設計
《UNIX網絡程式設計》學習筆記:基本TCP套接字程式設計

5.accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

傳回:若成功則為非負描述符,若出錯則為-1

功能:伺服器用于從已完成連接配接隊列隊頭傳回下一個已完成連接配接,如果已完成隊列為空,那麼程序被投入睡眠(假定套接字為預設的阻塞方式)。

參數cliaddr和addrlen用于傳回已連接配接的對端程序(客戶)的協定位址,addrlen是一個值-結果參數(Value-Result Argument)。

6.close(int sockfd);

傳回:若成功則為0,若出錯則為-1

功能:把該套接字标記成已關閉,然後立即傳回到調用程序。