有很多方法來獲取和設定影響套介面的選項:
這兩個函式僅用於套介面。
#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);
返回值:
0——成功,-1——出錯
sockfd必須指向乙個開啟的套介面描述字;
level(級別)指定系統中解釋選項的**:或為通用套介面**,或為某個特定於協議的**(例如ipv4、ipv6、tcp或sctp)。
optval是乙個指向變數(*optval)的指標,setsockopt從*optval中取得選項待設定的新值,getsockopt則把已獲取的選項當前值存放到*optval中。
optlen指定*optval的大小,它對於setsockopt是乙個值引數,對於getsockopt是乙個值-結果引數。
套介面選項粗分為兩大基本型別:
(1)標誌選項:開啟或禁止某個特性的二元選項。
(2)值選項:取得並返回我們可以設定或檢查的特定值的選項。
*optval的值為0表示禁止選項,不為0表示開啟選項。
非阻塞i/o。通過使用f_setfl命令設定o_nonblock檔案狀態標誌,我們可以把乙個套介面設定為非阻塞型。
訊號驅動i/o。通過使用f_setfl命令設定o_async檔案狀態標誌,我們可以把乙個套介面設定成一旦其狀態發生變化,核心就產生乙個sigio訊號。
f_setown命令允許我們指定用於接收sigio和sigurg訊號的套介面屬主(程序id或程序組id)。其中sigio訊號是套介面被設定為訊號驅動i/o型後產生的,sigurg訊號是在新的帶外資料到達套介面時產生的。f_getown命令返回套介面的當前屬主。
#include int fcntl(int fd, int cmd, ... /*每種描述字(包括套介面描述字)都有一組由f_getfl命令獲取或由f_setfl命令設定的檔案標誌。其中影響套介面描述字的兩個標誌是:int arg
*/);
返回值:依賴於cmd引數——成功,-1——出錯
o_nonblock 非阻塞i/o注意設定某個檔案狀態標誌的唯一正確的方法是:先取得當前標誌,與新標誌邏輯或後再設定標誌。例如,使用fcntl開啟非阻塞i/o的典型**是:o_async 訊號驅動i/o
intflags;
if( (flags = fcntl(fd, f_getfl, 0)) < 0
) err_sys(
"f_getfl error");
flags |=o_nonblock;
if(fcntl(fd, f_setfl, flags) < 0
) err_sys(
"f_setfl error
");
訊號sigio和sigurg的獨特之處
訊號sigio和sigurg與其他訊號的不同之處在於,這兩個訊號僅在已使用f_setown命令給相關套介面指派了屬主後才會產生。
f_setown命令的整數型別arg引數既可以是乙個正整數,指出接收訊號的程序id,也可以是乙個負整數,其絕對值指出接收訊號的程序組id。
f_getown命令把套介面屬主作為fcntl函式的返回值返回,它既可以是程序id(乙個正的返回值),也可以是程序組id(乙個除-1以外的負值)。
指定接收訊號的套介面屬主為乙個程序或乙個程序組的差別在於:前者僅導致單個程序接收訊號,而後者則導致整個程序組中的所有程序(也許不止乙個程序)接收訊號。
使用socket函式新建立的套介面並沒有屬主。然而如果乙個新的套介面是從乙個監聽套介面建立來的,那麼套介面屬主將由已連線套介面從監聽套介面繼承而來。
最常用的套介面選項
so_keepalive
給乙個tcp套介面設定保持存活(keep-alive)選項後,如果2小時內在該套介面的任一方向上都沒有資料交換,tcp就自動給對端傳送乙個保持存活探測分節(keep-alive probe)。這是乙個對端必須響應的分節。
本選項的目的是檢測對端主機是否崩潰或變得不可達。
本選項一般由伺服器使用,不過客戶也可以使用。
伺服器使用本選項是因為它們花大部分時間阻塞在等待穿越tcp連線的輸入上,也就是說在等待客戶的請求。然而如果客戶主機連線掉線、電源掉電或系統崩潰,伺服器程序將永遠不會知道,並將繼續等待永遠不會到達的輸入。我們稱這種情況為半開連線(half-open connection)。保持存活選項將檢測出這些半開連線並終止它們。
so_rcvbuf、so_sndbuf
每個tcp套介面和sctp套介面都有乙個傳送緩衝區和乙個接收緩衝區,每個udp套介面都有乙個接收緩衝區。so_sndbuf和so_rcvbuf套介面選項允許我們改變這些緩衝區的大小。對於客戶,so_rcvbuf選項必須在呼叫connect之前設定;對於伺服器,so_rcvbuf選項必須在呼叫listen之前給監聽套介面設定。
so_reuseaddr
so_reuseaddr套介面選項為以下四個不同的目的提供服務:
(1)so_reuseaddr允許啟動乙個監聽伺服器並**其眾所周知埠,即使以前建立的將該埠用作它們的本地埠的連線仍存在。
(2)so_reuseaddr允許在同一埠上啟動對同一伺服器的多個例項,只要每個例項**乙個不同的本地ip位址即可。
(3)so_reuseaddr允許單個程序**同一埠到多個套接字上,只要每次**指定不同的本地ip位址即可。
(4)so_reuseaddr允許完全重複的繫結:當乙個ip位址和埠已繫結到某個套介面上時,如果傳輸協議支援,同樣的ip位址和埠可以**到另乙個套介面上。一般來說,本特性只支援udp套介面。
所有tcp伺服器都應指定so_reuseaddr選項。
UNIX網路程式設計讀書筆記 原始套介面
應用程式可以繞過傳輸層而直接使用ipv4和ipv6,這稱為原始套介面 raw socket 原始套介面是一種對原始網路報文進行處理的套介面。原始套介面主要應用在底層網路程式設計上,同時也是網路黑客的必備手段。例如sniffer 拒絕服務 dos ip位址欺騙等都需要在原始套接字的基礎上實現。與原始套...
Unix網路程式設計讀書筆記(二)
套接字位址結構 typedef uint32 t in addr t struct in addr struct sockaddr in 在使用結構前總是把整個結構置零,是由於sin zero欄位沒有任何作用,只需置零即可。為了是套接字函式在處理位址時具有一定的通用性,套接字函式還定義了通用套接字位...
Unix網路程式設計讀書筆記(四)
unix下共有5種i o模型 阻塞式i o 非阻塞式i o i o復用 select和poll 訊號驅動式i o sigio 非同步i o posix的aio 系列函式 同步i o與非同步i o 同步i o操作導致請求程序阻塞,直到i o操作完成。前4種模型都是同步i o模型,因為其中真正的i o操...