socket-connect

摘要:網絡編程socket api存在一批覈心接口,而這一批覈心接口就是幾個看似簡單的函數,儘管實際上這些函數沒有一個是簡單。connect函數就是這些核心接口的一個函數,它完成主動連接的過程。

connect函數的功能是完成一個有連接協議的連接過程,對於TCP來說就是那個三路握手過程,它的函數原型:

#include<sys/socket.h> int connect(int sockfd, const struct sockaddr* server_addr, socklen_t addrlen) 返回:0──成功, -1──失敗。

 

爲了理解connect函數,我們需要對connect函數的功能進行介紹。connect函數的功能可以用一句話來概括,就是完成面向連接的協議的連接過程,它是主要連接的。面向連接的協議,在建立連接的時候總會有一方先發送數據,那麼誰調用了connect誰就是先發送數據的一方。如此理解connect三個參數是容易了,我必需指定數據發送的地址,同時也必需指定數據從哪裏發送,這正好是connect的前兩個參數,而第三個參數是爲第二個參數服務的。

參數sockfd
指定數據發送的套接字,解決從哪裏發送的問題。內核需要維護大量IO通道,所以用戶必需通過這個參數告訴內核從哪個IO通道,此處就是從哪個socket接口中發送數據。sockfd是先前socket返回的值。
參數server_addr
指定數據發送的目的地,也就是服務器端的地址。這裏服務器是針對connect說的,因爲connect是主動連接的一方調用的,所以相應的要存在一個被連接的一方,被動連接的一方需要調用listen以接受connect的連接請求,如此被動連接的一方就是服務器了。
參數addrlen
指定server_addr結構體的長度。我們知道系統中存在大量的地址結構,但socket接口只是通過一個統一的結構來指定參數類型,所以需要指定一個長度,以使內核在進行參數複製的時候有個有個界限。

 

與所有的socket網絡接口一樣,connect總會在某個時候可能失敗,此時它會返回-1,相應的errno會被設置,用戶可能通過這個值確定是哪個錯誤。常見的錯誤有對方主機不可達或者超時錯誤,也可以是對方主機沒有相應的進程在對應端口等待。

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