日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux Socket API Connect 函数详解

發布時間:2023/12/2 linux 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?sockaddraddrlen?設置?為?sizeof(struct?sockaddr)
connect函數在調用失敗的時候返回值-1,并會設置全局錯誤變量?errnoConnect?函數調用成功的時候返回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 函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。