socket可選項程式設計

2021-08-15 03:41:17 字數 3343 閱讀 4470

套接字有多種可選項,有時候是需要更改套接字可選項的,下面是一部分套接字可選項

套接字可選項是分層的。ipproto_ip層可選項是ip協議相關事項,ipproto_tcp層可選項是tcp協議相關事項,sol_socket層是套接字相關的通用可選項。

下面是讀取和設定可選項的函式

#includeint getsockopt(int sock,int level,int optname,void *optval,socklen *optlen);

//成功時返回0,失敗時返回-1

sock--用於檢視選項套接字檔案描述符

level--要檢視的可選項的協議層

optname--要檢視的可選項名

optvl--儲存檢視結果的緩衝位址值

optlen--向第四個引數optval傳遞的緩衝大小。

上述函式用於讀取套接字可選項,接下來介紹更改可選項時呼叫的函式。

#includeint setsockopt(int sock,int level,int optname,const void *optval,socklen *optlen);

//成功時返回0,失敗時返回-1

sock--用於更改選項套接字檔案描述符

level--要更改的可選項的協議層

optname--要更改的可選項名

optvl--儲存更改結果的緩衝位址值

optlen--向第四個引數optval傳遞的緩衝大小。

下面是getsockopt函式的呼叫方法

#include#include#include#includevoid error_handling(char *message);

int main(int argc,char *argv)

void error_handling(char *message)

一、i/o緩衝相關選項

so_rcvbuf是輸入緩衝大小相關可選項,so_sndbuf是輸出緩衝大小相關選項。既可以讀取當前緩衝i/o緩衝大小,也可以進行更改。下列示例讀取建立套接字時預設的i/o緩衝大小。

#include#include#include#includevoid error_handling(char *message);

int main(int argc,char *argv)

void error_handling(char *message)

下面示例是更改i/o緩衝大小:

#include#include#include#includevoid error_handling(char *message);

int main(int argc,char *argv)

void error_handling(char *message)

二、so_reuseaddr選項和time-wait狀態

time-wait狀態

套接字經過四次握手過程後並非立即消除,而是經過一段時間的time-wait狀態。只有先斷開連線的(先傳送fin訊息的)主機才經過time-wait狀態。因此,若伺服器端先斷開連線,則無法立即重新執行。套接字處在time-wait過程時,相應埠是正在使用的狀態。因此此時bind()函式的呼叫過程中會發生錯誤。

time-wait狀態發生的原因:假設有兩個主機a和b。假設主機a向b傳輸ack訊息後立即消除套接字。但最後這條ack訊息在傳遞途中丟失,未能傳給主機b。這時主機b會認為之前自己傳送的fin訊息未能抵達主機a,繼而試圖重傳。但此時主機a已是完全終止的狀態,因此主機b永遠無法收到從a最後傳來的ack訊息。相反,若主機a的套接字處在time-wait狀態,則會向主機b重傳最後的ack訊息,主機b也可以正常終止。基於以上,先傳輸fin訊息的主機應經過time-wait過程。

位址再分配

time-wait狀態似乎很重要,但是如果發生系統故障而緊急停止的情況,這時需要盡快重啟伺服器端以提供服務,但因處於time-wait狀態而必須等待幾分鐘。

解決方案就是在套接字的可選項中更改so_reuseaddr的狀態。適當調整該引數,可將time-wait狀態下的套接字埠號重新分配給新的套接字。so_reuseaddr的預設值為0,意味著無法分配time-wait狀態下的套接字埠號。因此將這個值改為1,以下**

optlen=sizeof(option);

option=true;

setsockopt(serv_sock,sol_socket,so_reuseaddr,(void*)&option,optlen);

三、tcp_nodelay選項和nagle演算法

關於nagle演算法

該演算法為防止資料報過多而發生網路過載而誕生,應用於tcp層。

只有收到前一資料的ack訊息時,nagle演算法才傳送下一資料。tcp套接字預設使用nagle演算法交換資料,因此最大限度地進行緩衝,直到收到ack。

一般情況下,不使用nagle演算法可以提高傳輸速度,但如果無條件放棄使用nagle演算法,就會增加過多的網路流量,反而影響傳輸。因此,未準確判斷資料特性時不應禁用nagle演算法。

禁用nagle演算法

禁用nagle演算法只需將套接字可選項tcp_nodelay改為1,下面是**實現

int opt_val=1;

setsockopt(sock,ipproto_tcp,tcp_nodelay,(void*)&opt_val,sizeof(opt_val));

可以通過tcp_nodelay的值檢視nagle演算法的設定狀態。

int opt_val;

socklen_t opt_len;

opt_len=sizeof(opt_val);

getsockopt(sock,ipproto_tcp,tcp_nodelay,(void*)&opt_val,&opt_len);

如果正在使用nagle演算法,opt_val變數中會儲存0;如果已禁用nagle演算法,則儲存1。

網路程式設計筆記 套接字可選項

套接字具體多種特性,可通過可選項更改。1 套接字可選項和i o緩衝大小 sol locket層是套接字相關的通用可選項 ipproto ip層可選項是ip協議相關事項 ipproto tcp層可選項是tcp協議相關事項 可選項的讀取和設定通過如下兩個函式完成 include intgetsockop...

三 可選項和控制流

三.可選項 optional 1.optional 1.1optional 可選值 1 optional是 swift 的一大特色,也是 swift 初學者最容易困惑的問題 2.定義變數時,如果指定是可選的,可選項有可能有值 有可能沒值 有 2種可能需要我們程式設計師自己去判斷一下 3.定義 變數或...

網路程式設計 9 套接字的多種可選項

套接字除了資料通訊以外,還有其他不同的特性可以根據實際需要進行更改。1 套接字多種可選項 比如想用sol socket 名為so type的可選項檢視套接字型別 int tcp sock socket pf inet,sock stream,0 int sock type socklen t opt...