**
套接字具體多種特性,可通過可選項更改。
1 套接字可選項和i/o緩衝大小
sol_locket層是套接字相關的通用可選項
ipproto_ip層可選項是ip協議相關事項
ipproto_tcp層可選項是tcp協議相關事項
可選項的讀取和設定通過如下兩個函式完成
sock用於檢視選項套接字檔案描述符
#include
intgetsockopt
(int sock,int level,int optname,void *optval,socklen_t *optlen)
; //成功時返回0.失敗時返回-1
level 要檢視的可選項的協議層
optname 要檢視的可選項名
optval 儲存檢視結果的緩衝位址值
optlen 向第四個引數optval傳遞的緩衝大小。呼叫函式後,該變數中儲存通過第四個引數返回的可選項資訊的位元組數
sock用於更改可選項套接字檔案描述符
#include
intsetsockopt
(int sock,int level,int optname,const
void *optval,socklen_t *optlen)
; //成功時返回0.失敗時返回-1
level 要更改的可選項的協議層
optname 要更改的可選項名
optval 儲存要更改的選項資訊的緩衝位址值
optlen 向第四個引數optval傳遞的可選項資訊的位元組數。
套接字型別型別只能在建立時覺得,以後不能再更改。
建立套接字將同時生產i/o緩衝。
so_rcvbuf是輸入緩衝大小相關可選項,so_sndbuf的輸出緩衝大小相關可選項。用這兩個選項既可以讀取當前i/o緩衝大小,也可以進行更改。
緩衝大小的設定需要謹慎處理,因為不會完全按照我們的要求進行,只是通過呼叫setsockopt函式向系統傳遞我們的要求。
2 so_reuseaddr
發生**分配錯誤binding error
p146~p147程式學習:強制終止程式時,由作業系統關閉檔案及套接字,此過程相當於呼叫close函式,也會向伺服器端傳遞fin訊息。
1)在客戶端控制台輸入q訊息,或通過crtl+c終止程式。讓客戶端先通知伺服器端終止程式,向伺服器端傳送fin訊息並經過四次握手過程,不會發生特別的事情。
2)伺服器端和客戶端已建立連線的狀態下,向伺服器端控制台輸入crtl+c,讓伺服器端先通知客戶端終止程式,即強制關閉伺服器端終止程式,那伺服器端重新執行時將產生問題。若用同一埠號重新執行伺服器端,將輸出「bind() error」訊息,並且無法再次執行。
time-wait狀態
套接字經過四次握手過程後並非立即清除,而是要經過一段時間的time_wait狀態。只有先斷開連線(先傳送fin訊息)的主機才經過time-wait狀態。若伺服器端先斷開連線,則無法立即重新執行。套接字處在time-wait過程時,相應埠是正在使用的狀態。
不管是伺服器端還是客戶端,套接字都會有time-wait狀態。先斷開連線的套接字必然經過time-wait過程。但無需考慮客戶端的time-wait狀態。因為客戶端套接字的埠號是任意指定的。與伺服器端不同,客戶端每次執行程式時都會動態分配埠號,因此無需過多關注time-wait狀態。
位址再分配
在主機a的四次握手過程中,如果最後的資料丟失,則主機b會認為a未收到自己傳送的fin訊息,因此重轉。這時,收到fin訊息的主機a將重啟time-wait計時器。因此,如果網路狀況不理想,time-wait狀態將持續。
解決方案就是在套接字的可選項中更改so_reuseaddr的狀態。適當調整該引數,可將time-wait狀態下的套接字埠號重新分配給新的套接字。so_reuseaddr的預設值是0,意味無法分配time-wait狀態下的套接字埠號。因此需要將這個值改為1.
3. tcp_nodelay
nagle演算法為防止因資料報過多而發生網路過載。應用於tcp層,非常簡單。
只有收到前一資料的ack訊息時,nagle演算法才傳送下一資料。
tcp套接字預設使用nagle演算法交換資料,因此最大限度地進行緩衝,直到收到ack。
不使用nagle演算法將對網路流量(traffic:指網路負載或混雜程度)產生負面影響。為了提高網路傳輸效率,必須使用nagle演算法。
在程式中將字串傳給輸出緩衝時並不是逐字傳遞的。
nagle演算法並不是什麼時候都可以用,網路流量未受未受太大影響時,不使用nagle演算法要比使用它的傳輸速度快。最典型的就是「傳輸大檔案資料」。將檔案資料傳入輸出緩衝不會花太多時間,即使不用nagle演算法也會在裝滿輸出緩衝時傳輸資料報。不僅不會增加資料報的數量,反而會在無需等待ack的前提下連續傳輸,因此可以大大提高傳輸速度。
禁用nagle演算法
如果有必要就禁用nagle演算法。
nagle演算法使用與否在網路流量上差別不大,使用nagle演算法的傳輸速度更慢。
禁用方法,只需將套接字可選項tcp_nodelay 改為1即可。
int iot_val=1;
intsetsockopt
(sock,ipproto_tcp,tcp_nodelay,(void*)&opt_val,sizeof
(opt_val)
;
網路程式設計 9 套接字的多種可選項
套接字除了資料通訊以外,還有其他不同的特性可以根據實際需要進行更改。1 套接字多種可選項 比如想用sol socket 名為so type的可選項檢視套接字型別 int tcp sock socket pf inet,sock stream,0 int sock type socklen t opt...
《網路程式設計》 第9章 套接字的多種可選項
ipproto ip層 ip協議相關事項 include int getsockopt int sock,int level,int optname,void optval,socklen t optlen 功能 讀取套接字可選項 引數 返回值 成功,返回0 失敗,返回 1。include int ...
socket可選項程式設計
套接字有多種可選項,有時候是需要更改套接字可選項的,下面是一部分套接字可選項 套接字可選項是分層的。ipproto ip層可選項是ip協議相關事項,ipproto tcp層可選項是tcp協議相關事項,sol socket層是套接字相關的通用可選項。下面是讀取和設定可選項的函式 includeint ...