Linux網路程式設計(七) 套接字選項

2021-06-23 01:33:30 字數 2513 閱讀 1181

1: #include
2: int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen);
3: int setsockopt(int sockfd,int level,int optname,const

void *optval,socklen_t optlen);

4: //返回:若成功為0,若出錯為-1
其中sockfd必須指向乙個開啟的套接字描述符,level指定系統中解釋選項的**或為通用套接字**,或為某個特定於協議的**

optval是乙個指向某個變數的指標

*optval是乙個整數,若*optval為0表示相應選項該被禁止,不為0表示相應選項被啟動

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

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

(2)對端以rst響應。它告知本端tcp:對端已經崩潰並重啟了。該套接字的待處理錯誤為econnreset,套接字本身則被關閉

(3)對端對保持存活探針沒有任何響應,tcp將傳送另外的8個分節,兩兩相隔75秒。tcp在發出第乙個探測分節後11分15秒內如果沒有得到響應,則會放棄

該套接字待處理錯誤為etimeout,套接字被關閉

關於2小時的時間引數,雖然可以修改,但是核心一般基於這個核心維護這些時間引數的,而不是基於乙個套接字,因此一旦改變2小時,將影響所有開啟本選項的套接字

預設的close操作是在呼叫後立即返回,但是如果有資料在套接字的傳送緩衝區中時,系統試著把這些資料傳送個對端

so__linger選項使得我們可以改變這個預設設定。本選項要求在使用者程序與核心間傳遞如下結構

struct linger

int l_onoff;

int l_linger;

(1)如果l_onoff為0,那麼關閉本選項。tcp預設設定生效,即close立即返回

(2)如果l_onoff為非0值且l_linger為0,那麼當close某個連線時tcp將終止該連線。也就是說tcp將丟棄儲存在傳送緩衝區中的殘留資料,並傳送乙個rst給對端,而沒有通常的四分組連線終止序列。這麼一來可以避免time_wait狀態

(3)如果l_onoff為非0值且l_linger為非0值,那麼當套接字關閉時核心將拖延一段時間。這就是說如果在套接字傳送緩衝區中仍有殘留資料,那麼程序將投入睡眠,直到所有資料都被傳送完且均被對方確認或者延遲時間到。

如果資料在傳送完並被確認前延遲時間到的話,close將返回ewouldblock錯誤,且緩衝區中的任何殘留資料都將被丟棄。

下圖總結了對shutdown和close呼叫的情況

每個套接字都有乙個傳送緩衝區和接收緩衝區

套接字的接收緩衝區限定了tcp通告視窗大小,不允許對端傳送超過本段所通告視窗大小的資料

當設定tcp接收緩衝區的大小時,函式呼叫順序很重要。因為tcp的視窗規模選項是在建立連線時用syn分節與對端互換得到的。對於客戶,so_rcvbuf選項必須在呼叫connect之前設定;對於伺服器必須在呼叫listen之前給監聽套接字設定本選項。給已連線套接字設定本選項沒有任何影響

tcp套接字接受緩衝區大小至少應該是相應連線的mss值的四倍

客戶tcp必須為每個分節儲存乙個副本,直到對方的ack到達

so_reuseaddr套接字選項能起到以下四個作用:

(1)so_reuseaddr選項允許啟動乙個監聽伺服器並**其眾所周知埠,即使以前用作它們的本地埠的連線仍存在

這個條件通常會這樣碰到

a.啟動乙個監聽伺服器

b.連線請求到達,派生乙個子程序來處理這個客戶

c.監聽伺服器終止,但子程序繼續為現有連線上的客戶提供服務

d.重啟監聽伺服器

在socket和bind之間設定該套接字選項

(2)允許在同一埠上啟動同一伺服器的多個例項,只要每個**乙個不同的本地ip位址

(3)允許單個程序**同一埠到多個套接字上,每次**指定不同的本地ip位址即可

在所有tcp伺服器程式中,在呼叫bind前設定so_reuseaddr套接字選項

網路程式設計7 套接字關閉

close 函式 int close int sockfd close函式會對套接字引用計數減一,一旦發現套接字引用計數到0,就會關閉tcp兩個方向的資料流,並徹底釋放套接字 在輸入方向上,系統核心會將套接字設定為不可讀,任何讀操作都會返回異常 在輸出方向上,系統核心嘗試將傳送緩衝區的資料傳送給對端...

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

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

網路程式設計 03 套接字和位址

socket到底是什麼?網路程式設計中到底如何理解socket,先看下面的圖 上面的圖表達了網路程式設計中客戶端和伺服器模型的核心邏輯。伺服器端 首選伺服器端要先初始化號好socket,之後伺服器端執行bind函式將自己的服務能力繫結在乙個特定的位址和埠上,緊接著伺服器端呼叫listen函式將原先的...