linux網路程式設計系列之connect函式詳解

2021-06-02 23:17:04 字數 1187 閱讀 9859

在講解套接字程式設計函式之前,有必要對socket程式設計的兩個不可或缺的結構體進行說明。

#includestruct sockaddr ;
由於歷史的原因,套接字函式中(如connect,bind等)使用的引數型別大多是sockaddr型別的。而如今進行套接字程式設計的時候大都使用sockaddr_in進行套接字位址填充

struct sockaddr_in ;
struct in_addr ;
struct sockaddr_in serv;

bind(sockfd,(struct sockaddr *)&serv,sizeof(serv));

否則c編譯器會產生警告資訊(把不相容的指標型別傳遞給「bind」函式的第二個引數)。(注意sockaddr_in的sin_port和 sin_addr 必須是網路位元組順序 (network byte order))

connect() 系統呼叫函式原型如下所示:

#include ; 

#include ;

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

sockfd 是系統呼叫 socket() 返回的套接字檔案描述符。serv_addr 是 儲存著目的地埠和 ip 位址的資料結構 struct sockaddr。addrlen 設定 為 sizeof(struct sockaddr)。

connect函式在呼叫失敗的時候返回值-1,並會設定全域性錯誤變數 errno。

如果是tcp套接字,呼叫connect會激發tcp的三路握手過程,其出錯返回設定errno變數值有如下幾種:

(1) 若tcp沒有收到syn分節的響應,則返回 會設定 errno變數值為etimedout。

(2) 若對客戶的syn的響應是rst(表示復位),則表明該伺服器主機在我們制定的埠上沒有程序在等待與之連線(例如伺服器程序或許沒有在執行),此時errno 會設定為econnrefused錯誤。

(3) 若客戶發出的syn在中間的某個路由器引發了乙個icmp錯誤報文(例如主機不可達)。客戶主機核心會儲存該資訊,並按一定的時間間隔繼續傳送syn,如若在某個規定得時間內還沒收到響應,則會把儲存的訊息作為ehostunreach返回給程序。

網路程式設計系列索引 Linux 網路程式設計索引

linux網路程式設計 tcp連線的分組交換與狀態轉移 linux網路程式設計 常見 socket 位址結構 linux網路程式設計 基本 tcp 套接字程式設計 linux網路程式設計 使用eclipse除錯libevent和開發libevent應用程式 linux網路程式設計 高階i o函式 l...

Linux網路程式設計系列 常見疑惑

乙個tcp連線有乙個四元組唯一標識 client端建立連線請求時,通常讓系統分配乙個空閒的本地埠,該埠是獨佔不共享的,埠型別是unsigned short,共65535個可用,所以client最大連線數為65535個。server端固定繫結乙個埠來等待client的連線請求,四元組中rempote ...

網路程式設計系列之十三 wireshark安裝檔案衝突

在閱讀freeradius client的原始碼的時候,需要測試並且通過wireshark抓包來看報文結構。在安裝wireshark的過程中遇到了檔案衝突的問題 1 yum y install wireshark 安裝wireshark的文字工具,沒有問題 2 yum y install wires...