套接字選項

2022-02-04 15:28:19 字數 1363 閱讀 1623

之前讀過unix網路程式設計,現在在看nginx原始碼,很多套接字選項不記得了,因此每遇到乙個套接字選項就在此文章中進行補充。

1.獲取和設定套接字選項的方法:

getsockopt,setsockopt函式

fcntl函式

ioctl函式

2.4種函式簡介:

i.getsockopt,setsockopt函式

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

int setsockopt(int sockfd,nt level,int optname,const void* optval,socklen_t optlen);

sockfd必須是乙個開啟的套接字描述符,level指定系統中解釋選項的**或為通用套接字**或為某個特定於協議的**。optval 是乙個指向某個變數的指標,setsockopt從*optval中取得選項待設定的新值,getsockopt則將獲取的選項值放入*optval中。*optval的大小由最後乙個引數指定,因此,獲取或者設定的資料型別一定要一一對應。

3.套接字選項:

這裡我將分不同的level來進行描述,但套接字選項可能和書上的順序不同,標誌欄位為0表示禁用,否則啟用。

i.sol_socket

so_keepalive,可獲得,可設定。資料型別為int,是乙個標誌字段。此選項的功能在於檢測對端主機是否崩潰或者不可達。

如果啟用so_keepalive選項,如果2小時內該套接字上兩端沒有資料交換,那麼設定了該標誌的一端的tcp將自動給對端傳送乙個保持存活探測分節(keep-alive probe)。它會導致以下三種情況:

a.對端以期望的ack響應,則一切正常,傳送端的程序不會收到任何通知。

b.對端以rst響應,它告知傳送端tcp,對端已崩潰且已重新啟動。該套接字的待處理錯誤被置為econnreset,套接字被關閉。

c.對端對此探測分節無響應,不同的系統可能會有不同的響應,但一般都是另外再傳送多個探測分節,傳送的相隔時間也因系統而不同,有些系統的相隔時間不一定相同。如果沒有探測分節的響應,則該套接字的待處理錯誤被置為etimeout,套接字被關閉。但如果套接字收到乙個icmp錯誤,那就返回響應響應錯誤(ehostunreach),這僅僅說明了對端主機不可達而已,這種情況下套接字也被關閉。

上述的2小時是否能被改變呢,在tcpv1附錄e中給出了核心如何修改定時引數,但一般由核心使用的改變,會使得所有的套接字都採取此定時引數。

為什麼要採用本選項?

一般是伺服器使用此選項,因為伺服器使用了大部分的時間等待對端的輸入,然而如果對端掉線或者崩潰或者關機,伺服器將不會知道並繼續等待輸入,設定此選項可以有效的終止這些tcp連線。

等待更新...

套接字選項

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

通用套接字選項和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...

通用套接字選項和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...