天天看點

Unix Network Programming(10)---connect 函數

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

#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);    /*傳回:若成功則為0,若出錯則為-1*/
           

函數解析:sockfd是由socket函數傳回的套接字描述符,第二個和第三個參數分别為一個指向套接字位址結構的的指針和該結構的大小。套接字位址結構必須含有伺服器的IP位址和端口号。

如果是TCP套接字,調用connect函數将激發TCP的三路握手過程,而且盡在連接配接建立成功或出錯時才傳回:

  1. 若TCP客戶沒有收到SYN分節的響應,則傳回ETIMEDOUT錯誤。
  2. 若對客戶的SYN響應是RST(表示複位),則表明該伺服器主機在我們指定的端口上沒有程序在等待與之連接配接(例如伺服器程序也許沒有正在運作)。硬錯誤(hard error),客戶一接受到RST就馬上傳回ECONNREFUSED錯誤。

    RST:在TCP發生錯誤時發送的一種TCP分節,三個條件:目的地為某端口的SYN到達,然而該端口上沒有正在監聽的伺服器;TCP想取消一個已有連接配接;TCP接收到一個根本不存在的連接配接上的分節。

  3. 客戶發出SYN在中間某個路由器引發“destination enreachable”的ICMP錯誤,則認為是一種“軟錯誤(soft error)”。客戶核心儲存該消息,并按一定間隔進行重傳,若在某個規定時間内仍未收到響應,則把儲存的資訊(ICMP錯誤)作為EHOSTUNREACH或ENETUNREACH錯誤傳回給程序。