TCP之connect


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接收到一個根本不存在的連接上的分節;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM