socket connect函數理解

 

socket connect函數理解

(1)connect描述

定義函數:
int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
connect函數通常用於客戶端建立tcp連接。

 

參數:
sockfd:標識一個套接字。
serv_addr:套接字s想要連接的主機地址和端口號。
addrlen:name緩衝區的長度。

 

返回值:
成功則返回0,失敗返回-1,錯誤原因存於errno中。

 

錯誤代碼: 
EBADF 參數sockfd 非合法socket處理代碼
EFAULT 參數serv_addr指針指向無法存取的內存空間
ENOTSOCK 參數sockfd爲一文件描述詞,非socket。
EISCONN 參數sockfd的socket已是連線狀態
ECONNREFUSED 連線要求被server端拒絕。
ETIMEDOUT 企圖連線的操作超過限定時間仍未有響應。
ENETUNREACH 無法傳送數據包至指定的主機。
EAFNOSUPPORT sockaddr結構的sa_family不正確。
EALREADY socket爲不可阻塞且先前的連線操作還未完成。

 

(2)SOCKET中連接過程比較
      connect是套接字連接操作,connect操作之後代表對應的套接字已連接,UDP協議在創建套接字之後,可以同多個服務器端建立通信,而TCP協議只能與一個服務器端建立通信,TCP不允許目的地址是廣播或多播地址,UDP允許。當然UDP協議也可以像TCP協議一樣,通過connect來指定對方的ip地址、端口。
      UDP協議經過connect之後,在通過sendto來發送數據報時不需要指定目的地址、端口,如果指定了目的地址、端口,那麼會返回錯誤。通過UDP協議可以給同一個套接字指定多次connect操作,而TCP協議不可以,TCP只能指定一次connect操作。UDP協議指定第二次connect操作之後會先斷口第一次的連接,然後建立第二次的連接。


(3)客戶端在建立同服務器端的連接過程
第一步都會通過socket建立連接套接字;
第二步通過bind來綁定本地地址、本地端口,當然綁定操作可以不用指定;
      對於UDP協議:若未指定綁定操作,那麼可以通過下面connect操作來由內核負責套接字的綁定操作,若
connect又未指定,那麼綁定操作只好通過套接字的寫操作(sendto、sendmsg)來指定目的地址、端口,這時
套接字本地地址不會指定,爲通配地址,而本地端口由內核指定,第一次sendto操作之後,插口的本地端口經
過內核指定之後就不會更改。
     對於TCP協議:若未指定綁定操作,可以通過下面connect操作來由內核負責套接字的綁定操作。內核會根
據套接字中的目的地址來判斷外出接口,然後指定該外出接口的IP地址爲插口的本地地址。Connect操作對於TCP
協議的客戶端是必不可少的,必須指定。

 

(4)非阻塞的 socket connect 
非阻塞模式有3種用途
        1.三次握手同時做其他的處理。connect要花一個往返時間完成,從幾毫秒的局域網到幾百毫秒或幾秒的廣域網。這段時間可能有一些其他的處理要執行,比如數據準備,預處理等。
        2.用這種技術建立多個連接。這在web瀏覽器中很普遍.
        3.由於程序用select等待連接完成,可以設置一個select等待時間限制,從而縮短connect超時時間。多數實現中,connect的超時時間在75秒到幾分鐘之間。有時程序希望在等待一定時間內結束,使用非阻塞connect可以防止阻塞75秒,在多線程網絡編程中,尤其必要。   例如有一個通過建立線程與其他主機進行socket通信的應用程序,如果建立的線程使用阻塞connect與遠程通信,當有幾百個線程併發的時候,由於網絡延遲而全部阻塞,阻塞的線程不會釋放系統的資源,同一時刻阻塞線程超過一定數量時候,系統就不再允許建立新的線程(每個進程由於進程空間的原因能產生的線程有限),如果使用非阻塞的connect,連接失敗使用select等待很短時間,如果還沒有連接後,線程立刻結束釋放資源,防止大量線程阻塞而使程序崩潰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章