套接字引數設定詳解

2021-08-14 02:06:42 字數 3841 閱讀 2949

該系統呼叫函式的原型:

#include

int setsockopt( int socket, int level, int option_name, const void *option_value, size_t option_len);

第乙個引數socket是套接字描述符;    第二個引數level是被設定的選項的級別,如果想要在套接字級別上設定選項,就必須把level設定為 sol_socket。    第三個引數option_name指定準備設定的選項,option_name可以有哪些取值,這取決於level,以linux 2.6核心為例(在不同的平台上,這種關係可能會有不同),在套接字級別上(sol_socket),option_name可以有以下取值:

1. so_debug,開啟或關閉除錯資訊。

當option_value不等於0時,開啟除錯資訊,否則,關閉除錯資訊。它實際所做的工作是在sock->sk->sk_flag中置sock_dbg(第10)位,或清sock_dbg位。

2. so_reuseaddr,開啟或關閉位址復用功能。

當option_value不等於0時,開啟,否則,關閉。它實際所做的工作是置sock->sk->sk_reuse為1或0。

3. so_dontroute,開啟或關閉路由查詢功能。

當option_value不等於0時,開啟,否則,關閉。它實際所做的工作是在sock->sk->sk_flag中置或清sock_localroute位。

4. so_broadcast,允許或禁止傳送廣播資料。

當option_value不等於0時,允許,否則,禁止。它實際所做的工作是在sock->sk->sk_flag中置或清sock_broadcast位。

5. so_sndbuf,設定傳送緩衝區的大小。

傳送緩衝區的大小是有上下限的,其上限為256 * (sizeof(struct sk_buff) + 256),下限為2048位元組。該操作將sock->sk->sk_sndbuf設定為val * 2,之所以要乘以2,是防止大資料量的傳送,突然導致緩衝區溢位。最後,該操作完成後,因為對傳送緩衝的大小作了改變,要檢查sleep佇列,如果有程序正在等待寫,將它們喚醒。

6. so_rcvbuf,設定接收緩衝區的大小。

接收緩衝區大小的上下限分別是:256 * (sizeof(struct sk_buff) + 256)和256位元組。該操作將sock->sk->sk_rcvbuf設定為val * 2。

7. so_keepalive,套接字保活。

如果協議是tcp,並且當前的套接字狀態不是偵聽(listen)或關閉(close),那麼,當option_value不是零時,啟用tcp保活定時器,否則關閉保活定時器。對於所有協議,該操作都會根據option_value置或清sock->sk->sk_flag中的 sock_keepopen位。

8. so_oobinline,緊急資料放入普通資料流。

該操作根據option_value的值置或清sock->sk->sk_flag中的sock_urginline位。

9. so_no_check,開啟或關閉校驗和。

該操作根據option_value的值,設定sock->sk->sk_no_check。

10. so_priority,設定在套接字傳送的所有包的協議定義優先權。linux通過這一值來排列網路佇列。

這個值在0到6之間(包括0和6),由option_value指定。賦給sock->sk->sk_priority。

11. so_linger,如果選擇此選項, close或 shutdown將等到所有套接字裡排隊的訊息成功傳送或到達延遲時間後》才會返回. 否則, 呼叫將立即返回。

該選項的引數(option_value)是乙個linger結構:

struct linger ;

如果linger.l_onoff值為0(關閉),則清sock->sk->sk_flag中的sock_linger位;否則,置該位,並賦sk->sk_lingertime值為linger.l_linger。

12. so_passcred,允許或禁止scm_credentials 控制訊息的接收。

該選項根據option_value的值,清或置sock->sk->sk_flag中的sock_passcred位。

13. so_timestamp,開啟或關閉資料報中的時間戳接收。

該選項根據option_value的值,清或置sock->sk->sk_flag中的sock_rcvtstamp位,如果開啟,則還需設sock->sk->sk_flag中的sock_timestamp位,同時,將全域性變數netstamp_needed加1。

14. so_rcvlowat,設定接收資料前的緩衝區內的最小位元組數。

在linux中,緩衝區內的最小位元組數是固定的,為1。即將sock->sk->sk_rcvlowat固定賦值為1。

15. so_rcvtimeo,設定接收超時時間。

該選項最終將接收超時時間賦給sock->sk->sk_rcvtimeo。

16. so_sndtimeo,設定傳送超時時間。

該選項最終將傳送超時時間賦給sock->sk->sk_sndtimeo。

17. so_bindtodevice,將套接字繫結到乙個特定的裝置上。

該選項最終將裝置賦給sock->sk->sk_bound_dev_if。

18. so_attach_filter和so_detach_filter。

關於資料報過濾,它們最終會影響sk->sk_filter。

以上所介紹的都是在sol_socket層的一些套接字選項,如果超出這個範圍,給出一些不在這一level的選項作為引數,最終會得到- enoprotoopt的返回值。但以上的分析僅限於這些選項對sock-sk的值的影響,這些選項真正如何發揮作用,我們的探索道路將漫漫其修遠。

如果不在套接字級別上設定選項,即setsockopt系統呼叫的引數level不設為sol_socket,那麼sys_setsockopt的實現會直接呼叫sock->ops->setsockopt。對my_pf_inet域的raw協議來講,sock->ops = myinet_sockraw_ops,而myinet_sockraw_ops.setsockopt = sock_common_setsockopt。

而sock_common_setsockopt直接呼叫sock->sk->sk_prot->setsockopt。對於raw協議來講,即myraw_setsockopt。

下面關注myraw_setsockopt的實現。對於raw協議來講,level還可以有兩種取值:sol_ip和sol_raw。 myraw_setsockopt首先檢查level是否為sol_ip,如果是,呼叫myip_setsockopt函式,該函式實現ip級別上的選項,否則,為sol_raw級別上的選項,sol_raw級別上只有乙個選項,即icmp_filter,在my_ipproto_icmp協議下有效。它啟用繫結到my_ipproto_icmp協議的乙個用於myraw socket特殊的過濾器。該值對每種icmp訊息都有乙個位(掩碼),可以把那種icmp訊息過濾掉,預設時是不過濾icmp訊息。

對於icmp_filter選項,myraw_setsockopt呼叫myraw_seticmpfilter函式,它把option_value賦給 sock->sk->filter,option_value是乙個結構體:

struct icmp_filter ;

它是乙個32位的位掩碼。

關於該位掩碼,我們目前知道的是最低位為回顯應答的位掩碼,由於目前我們的my_pf_inet域**還沒完善,我們在pf_inet域上進行測試,把下面的**新增到乙個ping程式中,ping程式就收不到來自伺服器的回應包了:

#include

#include

#include

#include

#include

int main()     

ckplayer 引數設定詳解

引數 使用說明fa scxi dulr 前置廣告的鏈結位址,多個用豎線隔開,沒有的留空ty z緩衝廣告,只能放乙個,swf格式ev 預設音量,0 100之間ph qmow gjk提示點時間,如 30 60滑鼠經過進度欄30秒,60秒會提示n引數指定的相應的文字,這是以 隔開的乙個數字陣列 這個是滑鼠...

引數設定 pandas引數設定小技巧

python大資料分析記錄 分享 成長 在日常使用pandas的過程中,由於我們所分析的資料表規模 格式上的差異,使得同樣的函式或方法作用在不同資料上的效果存在差異。而pandas有著自己的一套 引數設定系統 可以幫助我們在遇到不同的資料時靈活調節從而達到最好的效果,本文就將介紹pandas中常用的...

Matlab plot 引數設定

一 matlab繪圖中用到的直線屬性包括 1 linestyle 線形 2 linewidth 線寬 3 color 顏色 4 markertype 標記點的形狀 5 markersize 標記點的大小 6 marke cecolor 標記點內部的填充顏色 7 markeredgecolor 標記點...