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

2021-10-10 17:50:43 字數 2203 閱讀 7369

ipproto_ip層:ip協議相關事項;

#include

int getsockopt(int sock, int level, int optname,

​ void *optval, socklen_t *optlen);

功能:​ 讀取套接字可選項;

引數:

返回值:

​ 成功,返回0; 失敗,返回-1。

#include

int setsockopt(int sockfd, int level, int optname,

​ const void *optval, socklen_t optlen);

功能:​ 更改套接字可選項;

引數:

返回值:

​ 成功,返回0; 失敗返回 -1。

位置: 協議層 sol_socket裡。

(這裡假設主機a是伺服器)

time-wait時長:

​ 幾分鐘。

time-wait發生的時刻:

​ 四次揮手中,在發起方的最後一次揮手過程。

產生的效果:

​ 套接字在經過四次揮手過程後並非立即清除,而是要經過一段時間的 time-wait狀態。

time-wait的必要性:

​ 如果沒有time-wait,在第四次揮手的時候主機a既下線,此時若第四次揮手傳輸失敗(seq5001 ack 7502),主機b會認為是自己第三次揮手失敗,會繼續傳送(fin, ser 7501, ack 5001),但此時主機a已經關閉。

​ 有time-wait後,主機a在傳送第四次揮手後並不會立即關閉,而是等一段時間。這樣就能有效防止第四次揮手失敗了。

缺點:​ 等待的時間太長,如果因為故障需要緊急重啟計算機,而處於time-wait狀態的主機必須要等待幾分鐘。

解決方法:

​ 在套接字可選項中更改 so_reuseaddr的狀態,將其改為 true(1)。

​ optlen = sizeof(option);

​ option = true;

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

位置: 協議層 ipproto_tcp裡。

nagle 演算法

特點:​ 在資料交換過程:tcp套接字預設使用nagle演算法來交換資料。因此最大限度地進行緩衝,直到收到ack才進行下一步操作。這樣有效地提高網路傳輸效率減少了網路流量的混亂傳輸。(這裡說的效率是指準確性)

缺點:​ 無法提高傳輸速率,在傳輸大檔案資料時,即便不使用nagle演算法,也會在裝滿輸出緩衝區時傳輸資料報。這時不僅不會增加資料報的數量,反而要浪費時間等待ack。

如何禁用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, tco_nodelay, (void *) &opt_val, &opt_len );

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

**入口

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

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

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

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

第17章 套接字程式設計

1.使用tcp從伺服器獲取資料 end.2.乙個簡單的tcp伺服器 socket server.erl module socket server export start nano server 0,loop 1,nano client eval 1 start nano server gen tc...