Socket選項的那些事(一)

2021-07-04 20:50:32 字數 2429 閱讀 2914

ok,進入我們今天的分享,先來講述sol_socket協議族選項(通用位址族選項)

其實在進行網路程式設計的時候,我們需要經常去檢視並且設定套接字的某些特性。例如我們想去設定位址復用,設定讀寫資料的超時時間,想對讀寫緩衝區的大小進行調整,其中獲得套接字的選項就是getsckopt()函式,那麼對應話設定套接字的選項就是sesockopt()函式

介紹一下它們兩個

#include

int getsockopt(int s,int level,int optname,void* optval.socklen_t* optlen);

int setsockopt(int s,int level,int optname,void* optval.socklen_t optlen);

用來獲取和設定某個套接字相關的選項,選項可能存在於多層協議中,他們總會出現在最上面的套接字層。當對套接字選項進行操作的時候,我們必須給出選項所在的層次與名稱,為了操作套接字層的選項,應該將層的值指定為sol_socket,為了控制其它層的選項,必須給出控制選項的協議型別號。

我們來介紹上面兩個函式引數的含義

對於getsockopt,指向用於獲取返回值的緩衝區,setsockopt指向設定引數的緩衝區。optval表示第optval的長度。getsockopt,指向socklen_t型別的指標,當用於傳入引數時,表示傳入optval的實際長度。當用於傳出引數時,表示用於儲存optval的最大長度。

當用於傳出引數時,表示用於儲存optval的最大長度。對於setopt函式,optlen表示第四個引數實際的長度,在函式執行成功的時候返回值為0,函式執行失敗時返回為-1。同時我們可以根據錯誤**來判斷錯誤型別。

getsockopt()函式和setsocktopt()函式錯誤的**含義:

按照引數level值的不同,套接字選項可以分為三大類:

so_keepalive保持連線選項,2小時沒有資料互動,傳送探測報文,有三種回應:

使用方法:

就是呼叫setsockopt進行設定

int optval =1; 

setsockopt(sockfd,sol_socket,so_keepalive,&optval,sizeof(optval));

第二個引數表示通用位址族選項,第三個就表示keepalive選項

so_linger緩衝區處理方式選項,主要用於設定tcp連線關閉時的行為方式,它的操作通過乙個結構體進行:

struct linger;
根據以上結構體的不同,close呼叫可能產三種行為

我們介紹一下產生三種行為的不同方式:

使用方法:

optval.l_onoff =1

;optval.l_linger =60

; setsockopt(sockfd,sol_socket,so_linger,&optval,sizeof(optval));

設定兩個引數,然後進行set設定即可。

用於操作傳送緩衝區和接收緩衝區的大小,使用的時候我們需要注意兩點。

so_ rcvlowat表示接收超時,so_ sndlowat表示傳送超時,設定是通過乙個結構體實現的。

struct  timeval;
so_ rcvtimeo和so_ sndtimeo選項表示tcp接收緩衝區和傳送緩衝區的低水位標記,它們一般會被i/o系統復用呼叫,來判斷socket是否可讀或者可寫。

比如說某個伺服器程序占用了tcp伺服器的80埠。當再次監聽的時候會返回錯誤。設定了此選項可以解決這個問題。也就是可以共用這個埠。有的時候,我們經常會遇到,當我們非正常退出的時候,這個埠會過一段時間核心才會釋放,或者很久都沒有被釋放,我們無法再次開啟伺服器,設定了此選項就可以很好的解決這個問題了。

此選項的實際程式設計演示:

int sock = socket(af_inet,sock_stream,0);

assert(sock >=0);

int reuse = 1;

//設定so_reuseaddr可復用選項

setsockopt(sock,sol_socket,so_reuseaddr,&reuse,sizeof(reuse));

//伺服器的長用結構設定

struct sockaddr_in address;

bzero(&address,sizeof(address));

address.sin_family = af_inet;

inet_pton(af_inet,ip,&address.sin_addr);

address.sin_port = htons(port);

int ret = bind(sock,(struct sockaddr*)&address,sizeof(address));

https那些事(一)

公鑰 所有人都知道 私鑰 只有伺服器自己知道 公鑰加密資料,私鑰解密 只要能解密這個資料就代表是服務端 私鑰加密,公鑰解密 所有人都可以知道,但是沒人能對解析出來的資料 二次偽造 因為私鑰只存在在服務端 1 客戶端獲取伺服器公鑰以及加密演算法 2 客戶端 服務端 客戶端用公鑰加密乙個隨機數rd,加密...

css那些事(一)

一 內邊框padding和外邊框margin屬性縮寫 內外邊框有四個屬性 padding top,padding right,padding bottom,padding left margin top,margin right,margin bottom,margin left。將其簡寫,就是把四...

協議那些事 一

以下單流程為例 無論使用哪種協議 最終都會獲得乙個唯一ip 也就是我們的目標位址 知道了目標位址 瀏覽器開始打包請求 假設我們傳送了乙個下單請求 這裡就又要使用 傳輸協議了 無論使用哪種傳輸協議 協議都會包含請求內容 通常格式如下 dns http https所在層 既是應用層請求在應用層被封裝成包...