socket--connect函數詳解


轉自:http://www.cnblogs.com/newlist/archive/2012/02/19/2358611.html,尊重原創!

摘要:網絡編程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會被設置,用戶可能通過這個值確定是哪個錯誤。常見的錯誤有對方主機不可達或者超時錯誤,也可以是對方主機沒有相應的進程在對應端口等待。


免責聲明!

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



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