TCP IP程式設計之套接字選項詳解

2021-07-14 21:54:13 字數 2440 閱讀 2448

前述:

這篇文章主要介紹tcp/ip程式設計中我們常用的套接字選項,並不包括全部。

展開:

so_error

當乙個套接字上發生錯誤時,核心會將該套接字名為so_error的變數設定為標準的unix e***值中的乙個,我們稱它為該套接字的待處理錯誤(pending error)。核心能夠以下面兩種方式之一立即通知程序這個錯誤。

(1) 通過select檢查可讀條件或者可寫條件,select均會返回,可參考非阻塞connect的實現的應用

(2) 如果程序使用訊號驅動模式i/o模型,那就給程序或程序組產生乙個sigio訊號

so_keepalive

給套接字設定保持存活(keep-alive)的選項後,如果2小時內在該套接字的任一方向上都沒有資料交換,tcp就自動給對端傳送乙個保持存活探測分節。預設是不開啟。

通常業務伺服器會實現心跳包來檢測連線是否存活。

so_linger

本選項指定close函式對面向連線的協議(例如tcp和stcp)如何操作。預設操作是close立即返回,但是如果有資料殘留在套接字傳送緩衝區中,系統將試著把這些資料傳送給對端。

這裡有乙個基本的原則:設定so_linger套接字選項後,close的成功返回只是告訴我們先前傳送的資料(和fin)已由對端tcp確認,而不能告訴我們對端應用程序是否已讀取資料。如果不設定該套接字選項,那麼我們連對端tcp是否確認了資料都不知道。

so_rcvbuf和so_sndbuf

每個套接字都有乙個傳送緩衝區和乙個接收緩衝區。這兩個套接字允許我們改變這兩個預設緩衝區的預設大小。

當設定tcp套接字接收緩衝區的大小時,函式呼叫的順序很重要。這是因為tcp的視窗規模選項是在建立連線時用syn分節與對端互換得到的。對於客戶端,這意味著so_rcvbuf選項必須在呼叫connect之前設定;對於伺服器,這意味著該選項必須在呼叫listen之前給監聽套接字設定。給已連線套接字設定該選項對於可能存在的視窗規模選項沒有任何影響,因為accept直到tcp的三路握手完成才會建立並返回套接字。這就是必須給監聽套接字設定本選項的原因。(套接字緩衝區的大小總是由新建立的已連線套接字從監聽套接字繼承而來)

so_rcvlowat和so_sndlowat

每個套接字還有乙個接收低水位和乙個傳送低水位標記,它們由select函式使用。本質上就是檢查接收緩衝區是否有資料可讀,傳送緩衝區是否有足夠可用空間。

so_revtimeo和so_sndtimeo

在套接字阻塞情況下,這兩個選項允許我們給套接字的接收和傳送設定乙個超時值,注意,訪問它們的getsockopt和setsockopt函式的引數是指向timeval結構的指標。這可讓我們用秒數和微秒數來規定超時。我們通過設定其值均為0來禁用超時。預設情況下這兩個選項的超時都是禁止的。

so_reuseaddr和so_reuseport

so_reuseaddr套接字選項在tcp中能起到以下作用,該套接字應該在bind函式呼叫前設定。

(1) so_reuseaddr允許啟動乙個監聽伺服器並**其埠,即使以前建立的該埠用作它們的本地埠的連線仍存在(fork程式設計,父程序退出,子程序accept了連線後,關閉監聽套接字)

(2) so_reuseaddr允許在同乙個埠上啟動同乙個伺服器的多個例項,主要每個例項**乙個不同的本地ip位址即可。假設本地主機有兩個ip位址198.69.10.128和198.69.10.129,在呼叫bind函式前,設定了so_reuseaddr,則可以使用不同的ip和同乙個埠啟動兩個伺服器。

更多細節參考文章:tcp/ip程式設計之so_reuseaddr和so_reuseport套接字選項

so_type

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

tcp_maxseg

本選項允許我們獲取和設定tcp連線的最大分節大小(mss)。返回值是我們的tcp可以傳送給對端的最大資料量。

tcp_nodelay

Linux 之 網路程式設計之套接字選項

獲取和設定套接字選項 so keepalive選項 so linger選項 so rcvbuf和so sndbuf選項 so rcvlowat和so sndlowat選項 so rcvtimeo和so sndtimeo選項 so reuseaddr選項getsockopt 函式和setsockopt...

套接字選項

有很多方法獲取和設定影響套接字的選項 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...