Linux Socket API Connect 函数详解
在講解套接字編程函數之前,有必要對socket編程的兩個不可或缺的結構體進行說明。
第一個結構體式struct sockaddr.。這個結構為許多類型的套接字儲存套接字地址信息:
?Sockaddr結構體介紹
? #include<sys/socket.h> ?
??
?struct sockaddr { ??
? ? ?uint8_t sa_len; ??
? ? ?unsigned short sa_family; /* 地址家族, AF_xxx */ ??
? ? ?char sa_data[14]; /*14字節協議地址*/ ?
?}; ??
由于歷史的原因,套接字函數中(如connect,bind等)使用的參數類型大多是sockaddr類型的。而如今進行套接字編程的時候大都使用sockaddr_in進行套接字地址填充
sockaddr_in結構體介紹
?struct sockaddr_in { ??
? uint8_t sa_len; ? /* 結構體長度*/ ??
? ? ? ? ?short int sin_family; /* 通信類型 */ ??
? unsigned short int sin_port; /* 端口 */ ??
? struct in_addr sin_addr; /* Internet 地址 */ ??
? unsigned char sin_zero[8]; /* 未使用的*/ ??
}; ?
?struct in_addr { ? //sin_addr的結構體類型in_addr 原型 ?
? unsigned long s_addr; ? ? /*存4字節的 IP 地址(使用網絡字節順序)。*/ ?
? }; ??
因此,這就要求對這些函數進行調用的時候都必須要講套接字地址結構指針進行類型強制轉換,例如:
1. struct sockaddr_in serv; ? ?
2. bind(sockfd,(struct sockaddr *)&serv,sizeof(serv)); ?
否則C編譯器會產生警告信息(把不兼容的指針類型傳遞給“bind”函數的第二個參數)。(注意sockaddr_in的sin_port和 sin_addr 必須是網絡字節順序 (Network Byte Order))
Conncet函數介紹
connect() 系統調用函數原型如下所示:
1. #include <sys/types.h>; ??
2. #include <sys/socket.h>; ?
3. int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); ??
sockfd?是系統調用?socket()?返回的套接字文件描述符。serv_addr?是?保存著目的地端口和?IP?地址的數據結構?struct?sockaddr。addrlen?設置?為?sizeof(struct?sockaddr)。
connect函數在調用失敗的時候返回值-1,并會設置全局錯誤變量?errno。Connect?函數調用成功的時候返回0,并返回一個標示此連接。客戶端就可以通過sockfd進行與服務端的通信。
?
如果是TCP套接字,調用connect會激發TCP的三路握手過程,首先發送SYN請求的報文給服務端,其出錯返回設置errno變量值有如下幾種:
(1)?若TCP沒有收到SYN分節的響應,則返回?會設置?errno變量值為ETIMEDOUT。
(2)?若對客戶的SYN的響應是RST(表示復位),則表明該服務器主機在我們制定的端口上沒有進程在等待與之連接(例如服務器進程或許沒有在運行),此時errno?會設置為ECONNREFUSED錯誤。
(3)?若客戶發出的SYN在中間的某個路由器引發了一個ICMP錯誤報文(例如主機不可達)。客戶主機內核會保存該信息,并按一定的時間間隔繼續發送SYN,如若在某個規定得時間內還沒收到響應,則會把保存的消息作為EHOSTUNREACH返回給進程。
總結
以上是生活随笔為你收集整理的Linux Socket API Connect 函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 问题: 将N个元素使用push_back
- 下一篇: 《Linux网络接口》---------