第七章 套接字選項

2021-08-26 10:20:11 字數 2577 閱讀 1590

第七章 套接字選項

先介紹改變和獲取套接字選項的兩個函式

intsetsockopt(int fd, int level, int optname, const void* optval, socklen_t*optlen);

intgetsockopt(int fd, int level, int optname, void* optval, socklen_t *len);

fd 是已經開啟的套接字(呼叫socket之後)level是指定系統中解釋選項的**:普通套介面**或者特定於協議的** optname是針對level的,是level下的子項,opval是獲得的結果,通過getsockopt或者level中的optname欄位的套接字屬性(性質),其中len是表示optval的大小,這些level和optname之間的關係如下表

以上的表對於level的字段都是可以設定的標誌是optname

對於某些字段選項,有一定的時序關係,下面的選項都是從監聽套介面繼承來的,如果對某些已經連線的套介面使用這些選項的話,那麼就得對監聽套介面設定這些選項,這樣就會繼承下來。這些標誌是:so_debug, so_dontroute,so_keepalive, so_linger, so_oobinline, so_rcvbuf, so_sndbuf。

基本套介面選項:

so_broadcast:此選項使能或禁止程序傳送廣播資訊的能力,必須是資料報套介面,而且是支援廣播的網路上。

so_debug:此選項支援tcp,當給乙個tcp套介面加上這個標誌的時候,核心對該tcp套介面接受和傳送的資料的所有分組進行跟蹤詳細資訊,這些資訊儲存在核心的環形緩衝區中,可又程式trpt來進行檢查

so_dontroute:此選項規定發出的分組將旁路底層協議的正常路由機制,根據目的位址和子網部分所確定的本地介面,如果本地介面不能由目的位址確定的話,就直接返回enetunreach

參考:so_error:當套介面上發生錯誤的時候,核心會通知程序按照如下方式:

socket阻塞在select時候,發生錯誤,返回

程序使用訊號驅動i/o模型的時候,就會給程序傳送sigio訊號

so_keepalive:如果給定乙個tcp設定了這個標誌時候,如果兩個小時之間cs之間沒有任何資料進行來往的話,這個tcp套介面就會向另外一端傳送乙個保持存活的探測分節一下是另外一端的響應:

1如果另外一端正確的返回ack資料報,那麼如果之後的互動中兩個小時之內沒有資料互動的話,還是會傳送這樣的探測分節

2如果另外一端返回的是rst資料報,說我這段已經崩潰,得重新建立連線,,套介面待處理錯誤被設定為econnreset

3如果傳送了探測分節,但是另外一端沒有反應則設定標誌為etimeout如果收到了icmp資料報的話,錯誤標誌就會設定成ehostunreach

so_linger:此選項是close面向連線的時候是如何操作的(例如tcp而不是udp)close的預設操作如果緩衝區中有資料,傳送完這些資料後返回,如果沒有資料直接返回,在setsockopt設定的optval的型別是

structlinger{

int l_onoff;

int l_linger

l_onoff為0的時候表示關閉這個功能,非0的時候開啟這個功能

l_linger為0 的時候,丟棄緩衝區中的資料,並且直接傳送rst資料報

l_linger 為非0的時候,程序就會休眠,等待傳送完緩衝區的資料(同時收到ack包)或者l_linger時間到的時候才返回,套接字設定為非阻塞的,則close操作直接返回

so_rcvbuf:設定接受緩衝區的大小

so_sndbuf:設定傳送緩衝區的大小。

對於tcp來說,套介面的接受緩衝區的可用空間大小就是tcp通告另外的視窗大小。tcp套介面的緩衝區不可能溢位,因為對方不允許發出超過所通告的視窗大小的資料,這就是tcp的流量控制

對於udp當核心緩衝區不能儲存下收到的資料報資料的時候,次資料報就會被丟棄

so_rcvlowatso_sndlowat是接受低潮限度和傳送低潮限度,傳送的時候,資料得大於so_sndlowat才能被傳送,接受的資料大於so_rcvlowat的值得時候read才能返回。

so_rcvtimeoso_sndtimeo是設定接受和傳送超時,optval設定的是timeval的值,用來設定超時的時間

so_reuseaddrso_reuseport是重用位址和埠

so_type這個返回套接字的型別 sock_stream sock_dgram

so_useloopback:此選項設定路由域的套介面(af_route)這些套介面的預設設定是開啟的,此選項開啟時,套介面拷貝從該套介面傳送的資料。

這些僅僅是sol_sock的標誌(與協議無關)

UNP學習筆記(第七章 套接字選項)

有多種方法獲取和設定影響套接字的選項 1.getsockopt和setsockopt函式 2.fcntl函式 3.ioctl函式 getsockopt和setsockopt函式 這兩個函式僅用於套接字 include int getsockopt int sockfd,int level,int o...

UNP學習筆記(第七章 套接字選項)

有多種方法獲取和設定影響套接字的選項 1.getsockopt和setsockopt函式 2.fcntl函式 3.ioctl函式 getsockopt和setsockopt函式 這兩個函式僅用於套接字 include int getsockopt int sockfd,int level,int o...

python第七章 python教程(第七章)

字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...