通用套接字選項和TCP套接字選項

2021-07-31 13:41:48 字數 3357 閱讀 9989

1. 套接字選項函式原型:

#include int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);

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

void *optval, socklen_t optlen);

ret-成功返回0 失敗返回-1

2. 通用套接字選項:

(1) so_broadcast:

本選項開啟或禁止程序傳送廣播訊息的能力;只有資料報套接字支援廣播,並且還必須是在支援廣播訊息的網路上;

(2) so_debug:

本選項僅由tcp支援。當給乙個tcp套接字開啟本選項,核心將為tcp在該套接字和接收的所有分組保留詳細跟蹤資訊。這些資訊儲存在核心的某個環形緩衝區中,並可以使用trpt程式進行檢查;

(3) so_dontroute:

本選項規定外出的分組將繞過底層協議的正常路由機制,以強制將分組從特定介面送出;

(4) so_error:

當乙個套接字上發生錯誤時,源自berkeley的核心中的協議模組將該套接字的名為so_error的變數設為標準的unix_e***值中的乙個,我們稱它為該套接字的待處理錯誤。核心能夠以下面的兩種方式之一立即通知程序這個錯誤;

--如果程序阻塞在對該套接字的select呼叫上,那麼無論是檢查可讀條件還是可寫條件,select均返回並設定其中乙個或所有兩個條件;

--如果程序使用訊號驅動式i/o模型,那就給程序或者程序產生乙個sigio訊號;

程序然後可以通過訪問so_error套接字選項後去so_error值。由getsockopt返回的整數值就是該套接字的待處理錯誤。so_error隨後由核心復位為0;

(5) so_keepalive:

給乙個tcp套接字設定保持存活選項後,如果2小時內在該套接字的任一方向上沒有資料交換,tcp就自動給對端傳送乙個保持存活探測分節。這是乙個對端必須響應的tcp分節,它會導致以下三種情況之一;

--對端以期望的ack響應。應用程序得不到通知。在又經過無動靜的2小時之後,tcp將發出另外乙個探測分節;

--對端以rst響應,它告知本端tcp,對端已崩潰且重新啟動。該套接字的待處理錯誤被置econnreset,套接字本身則被關閉;

--對端對保持存活探測分節沒有任何響應。源自berkeley的tcp將另外傳送8個探測分節,兩兩相隔75秒,檢視得到乙個響應。如果探測分節沒有響應,該套接字的處理錯誤被置為etimeout;

(6) so_linger:

--shutdown, shut_rd: 在套接字上不能再發出接收請求,程序仍可以網套接字傳送時資料,套接字接收緩衝區中所有資料被丟棄;再接收到任何的tcp丟棄;對套接字傳送緩衝區沒有任何影響;

--shutdown, shut_wr: 在套接字上不能再發出傳送請求,程序仍可以從套接字接收資料,套接字傳送緩衝區中的內容被傳送到對端,後跟正常的tcp連線終止序列,即傳送fin,對套接字接收緩衝區沒有任何影響;

--close,l_onoff=0: 在套接字上不能再發出傳送或者接收請求;套接字傳送緩衝區中的內容被傳送到對端,如果描述符引用計數變為0,在傳送完傳送緩衝區中的資料後,跟以正常的tcp連線終止序列,套接字接收緩衝區中的內容被丟棄;

--close,l_onoff = 1, l_linger = 0: 在套接字上不能再發出傳送或接收請求;如果描述符引用計數變為0,rst被傳送到對端;連線狀態被置為closed(沒有time_wait);套接字傳送緩衝區和套接字接收緩衝區中的資料被丟棄;

--close, l_onoff = 1, l_linger != 0: 在套接字上不能再發出傳送或者接收請求;套接字傳送緩衝區的資料被傳送到對端;如果描述符引用計數為0,在傳送完緩衝區中的資料後,跟以正常的tcp連線終止序列;套接字接收緩衝區的資料被丟棄;如果在連線變為closed狀態前延滯時間到,那麼colose返回ewouldblock錯誤;

(7) so_rcvbuf, so_sndbuf:

每個套接字都有乙個傳送緩衝區和乙個接收緩衝區;tcp套接字的緩衝區大小至少應該是mss的4倍;mss=mtu-40頭部,一般乙太網卡mtu是1500;典型緩衝區預設大小是8192位元組或者更大;對於一次傳送大量資料,可以增加到48k,64k等;為了達到最佳效能,緩衝區可能至少要與bdp(頻寬延遲乘積)一樣大小;對於接收大量資料的,提高接收緩衝區能夠減少傳送端的阻塞;

tcp設定這個兩個選項注意順序:對於客戶端必須在呼叫connect之前,對於伺服器端應該在呼叫listen之前,因為視窗選項是在建立連線時用syn分節與對端互換得到的;

(8) so_rcvlowat, so_sndlowat:

每個套接字還有乙個接收低水位標記和乙個傳送低水位標記。他們由select函式使用,接收低水位標記是讓select返回可讀時套接字接收緩衝區中所需的資料量;對於tcp,udp,預設值是1;傳送低水位標記是讓select返回可寫時套接字傳送緩衝區中所需的可用空間;對於tcp套接字,其預設值通常為2048;

(9) so_rcvtimeo, so_sndtimeo:

這兩個選項允許我們給套接字的接收和傳送設定乙個超時值,注意,訪問getsockopt和setsockopt函式的引數是指向timeval的指標,與select所用的引數相同;

(10) so_type:

本選項返回套接字的型別,返回的整數值是乙個注入sock_stream或者sock_dgram之類的值;本選項通常由啟動時繼承了套接字的程序使用;

(11) so_useloopback:

本選項僅用於路由域(af_route)套接字,預設設定是開啟,相應套接字 將接收在其上傳送的任何資料報的乙個副本;

(12) so_reuseaddr:

tcp先呼叫close()的一方會進入time_wait狀態,只有設定了so_reuseaddr選項的socket,才可以重複繫結使用。server程式總是應該在呼叫bind之前設定so_reuseaddr套接字選項。

這個套接字選項通知核心,如果埠忙,但tcp狀態位於 time_wait ,可以重用埠。如果埠忙,而tcp狀態位於其他狀態,重用埠時依舊得到乙個錯誤資訊,指明"位址已經使用中"。如果你的服務程式停止後想立即重啟,而新套接字依舊使用同一埠,此時so_reuseaddr 選項非常有用。必須意識到,此時任何非期望資料到達,都可能導致服務程式反應混亂,不過這只是一種可能,事實上很不可能。

3. tcp套接字選項:

(1) tcp_maxseg:

本選項允許我們獲取或者設定tcp連線的最大分節大小(mss)。已建立連線返回的是對端使用syn通知的mss值,否則是未從對端收到mss情況下使用的預設值;

(2) tcp_nodelay:

開啟本選項將禁止tcp的nagle演算法,預設情況下nagle演算法是啟動的;關於nagle演算法,單獨總結一篇;

通用套接字選項和TCP套接字選項

1.套接字選項函式原型 include int getsockopt int sockfd,int level,int optname,void optval,socklen t optlen int setsockopt int sockfd,int level,int optname,const...

套接字選項

有很多方法獲取和設定影響套接字的選項 getsockopt和setsockopt函式 fcntl函式 ioctl函式 getsockopt和setsockopt函式 int getsockopt int sockfd,int level,int optname,void optval,socklen...

套接字選項

之前讀過unix網路程式設計,現在在看nginx原始碼,很多套接字選項不記得了,因此每遇到乙個套接字選項就在此文章中進行補充。1.獲取和設定套接字選項的方法 getsockopt,setsockopt函式 fcntl函式 ioctl函式 2.4種函式簡介 i.getsockopt,setsockop...