1. connect函數:
#include <sys/socket.h> int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); ret-成功返回0 失敗返回-1
connect函數是把當前套接字從CLOSED狀態轉移到SYN_SENT狀態,若成功則再轉移到ESTABLISHED狀態。若connect失敗則該套接字不再可用,必須關閉,我們不能對這樣的套接字再次調用connect函數。當循環調用connect為給定主機嘗試各個ip地址直到有一個成功時,在每次connect之后,都必須close當前套接字,並重新調用socket;
2. connect不需要bind:
在調用connect之前不必非得調用bind函數,如果需要的話,內核會確定源IP地址,並選擇一個臨時端口作為源端口;
3. TCP套接字connect錯誤:
(1) 若TCP客戶端沒有收到syn分節的響應,則返回ETIMEOUT錯誤;調用connect函數時,內核發送一個syn,若無響應則等待6s后再發送一個,若仍然無響應則等待24s后在發送一個,若總共等待75s后仍未收到響應則返回本錯誤;
(2) 若對客戶的syn響應是rst,則表明該服務器在我們指定的端口上沒有進程在等待與之連接,這是一種硬錯誤,客戶一收到rst馬上返回ECONNREFUSED錯誤;
(3) 若客戶發送的syn在中間的某個路由器上引發了目的不可達icmp錯誤,則認為是一種軟錯誤。客戶主機內核保存該消息,並按照第一種情況的時間間隔繼續發送syn,咋某個規定時間后仍未收到響應,則把保存的消息作為EHOSTUNREACH或者ENETUNREACH錯誤返回給進程;
4. 產生RST三個條件:
(1) 目的地為某端口的syn到達,然而該端口上沒有正在監聽的服務器;
(2) tcp想取消一個已有連接;
(3) tcp接收到一個根本不存在的連接上的分節;