-
TCP客戶用connect函數來建立與TCP服務器的連接:
#include<sys/socket.h> int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen) 返回:若成功則為0,若出錯則為-1
-
sockfd是由socket函數返回的套接字描述符,第二個、第三個參數分別是一個指向套接字地址結構的指針和該結構的大小。套接字地址結構必須含有服務器的IP地址和端口號。
-
客戶在調用connect之前不必非得調用bind函數,因為如果需要的話,內核會確定源IP地址並選擇一個臨時端口作為端口號。
-
如果是TCP套接字,調用connect函數將激發TCP的三次握手過程,而且僅在連接建立成功或出錯時才返回,其中,出錯返回的可能情況有以下幾種:
- 若TCP客戶沒有收到SYN分節的相應,則返回ETIMEDOUT錯誤。舉例,調用connect函數時,4.4BSD內核發送一個SYN,若無響應則等待6s后再發送一個,若仍無響應則等待24s后再發送一個。若總共等待了75s后仍未收到響應則返回本錯誤。
- 若對客戶的SYN的響應是RST(表示復位),則表明該服務器主機在我們指定的端口上沒有進程在等待與之連接。這是一種硬錯誤,客戶一收到RST就馬上返回ECONNREFUSED錯誤。
- 若客戶發出的SYN在中間的某個路由器上引發了一個“destination unreachable”(目的地不可達)ICMP錯誤,則認為是一個軟錯誤。客戶主機內核保存該消息,並按第一種情況所述的時間間隔繼續發送SYN。若在某個規定的時間內仍無響應,則把保存的信息(即ICMP錯誤)作為EHOSTUNREACH或ENETUNREACH錯誤返回給進程。以下兩種情況是有可能的:一是按照本地系統的轉發表,根本沒有到達遠程系統的路徑;二是connect調用根本不等待就返回。
-
按照TCP狀態轉換圖,connect函數導致當前套接字從CLOSED狀態轉移到SYN_SENT狀態,若成功再轉移到ESTABLISHED狀態。若connect失敗,則該套接字不再可用,必須關閉,我們不能對這樣的套接字再次調用connect函數。