1. 程式人生 > >道雖邇,不行不至;事雖小,不為不成

道雖邇,不行不至;事雖小,不為不成

TCP客戶用connect函式來建立與TCP伺服器的連線。

#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);

sockfd是由socket函式返回的套接字描述符,第二個引數、第三個引數分別是一個指向套接字地址結構的指標和該結構的大小。套接字地址結構必須含有伺服器的IP地址和埠號。
客戶在呼叫函式connect前不必非得呼叫bind函式,因為如果需要的話,核心會確定源IP地址,並選擇一個臨時的埠作為源埠。
如果是TCP套接字,呼叫connect函式將激發TCPTCP的三次握手 過程,而且僅在連線建立成功或出錯的時候才返回,其中出錯返回可能有以下幾種情況。
(1)若TCP客戶沒有收到SYN分節的響應,則返回ETIMEOUT出錯,舉例來說,呼叫connect函式時,4.4BSD核心傳送一個SYN,若無響應則等待6s後再發送一個,若仍無響應則等待24s後再發送一個。若總共等了75s後仍未收到響應則返回出錯。
(2)若對客戶的SYN的響應是RST(表示復位),則表明該服務主機在我們指定的埠上沒有程序在等待與之連線。這是一種硬出錯,客戶一接收到RST就馬上返回ECONNREFUSED出錯。
RST是TCP在發生錯誤時傳送的一種TCP分節,產生RST的三個條件是:目的地為某埠的SYN達到,然而該埠上沒有正在監聽的伺服器;TCP想取消一個已有的連線;TCP接收到一個根本不存在的連線上的分節。
(3)若客戶發出的SYN在中間的某個路由器上引發一個“destination UNreachable”(目的不可達)ICMP錯誤,則認為是一種軟錯誤,客戶主機核心儲存該訊息,並按第一種情況中所述的時間間隔繼續傳送SYN。若在某個規定的時間後仍未收到響應,則把儲存的訊息作為EHOSTUNREACH或ENETUNREACH錯誤 返回給程序。以下兩種情形也是有可能的:一是按照本地系統的轉發表,根本沒有達到遠端系統的路徑;二是connect呼叫根本不等待就返回。
若connect失敗則該套接字不再可用,必須關閉。我們不能對給定主機嘗試再次呼叫connect函式。當迴圈呼叫函式connect為給定主機嘗試各個IP地址直到有一個成功時,在每次connect失敗後,都必須close當前的套接字描述符,並重新呼叫socket。