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

2021-08-31 06:45:35 字數 2958 閱讀 1999

**

套接字具體多種特性,可通過可選項更改。

1 套接字可選項和i/o緩衝大小

sol_locket層是套接字相關的通用可選項

ipproto_ip層可選項是ip協議相關事項

ipproto_tcp層可選項是tcp協議相關事項

可選項的讀取和設定通過如下兩個函式完成

#include

intgetsockopt

(int sock,int level,int optname,void *optval,socklen_t *optlen)

; //成功時返回0.失敗時返回-1

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

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

optname 要檢視的可選項名

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

optlen 向第四個引數optval傳遞的緩衝大小。呼叫函式後,該變數中儲存通過第四個引數返回的可選項資訊的位元組數

#include

intsetsockopt

(int sock,int level,int optname,const

void *optval,socklen_t *optlen)

; //成功時返回0.失敗時返回-1

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

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 ...