套接字有多種可選項,有時候是需要更改套接字可選項的,下面是一部分套接字可選項
套接字可選項是分層的。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...