帶外資料(out-of-band data)是一些通訊協議所支援的可選特徵,允許更高優先順序的資料比普通資料優先傳輸。即使傳輸佇列已經有資料,帶外資料先行傳輸。tcp支援帶外資料,但是udp不支援。套接字介面對帶外資料的支援,很大程度受tcp帶外資料具體實現的影響。
tcp將帶外資料稱為「緊急」資料(「urgent」data)。tcp僅支援乙個位元組的緊急資料,但是允許緊急資料在普通資料傳遞機制資料流之外傳輸。為了產生緊急資料,在三個send函式中任何乙個指定標誌msg_oob。如果帶msg_oob標誌傳輸位元組超過乙個時,最後乙個位元組被看作緊急資料位元組。
如果安排發生套接字訊號,當接收到緊急資料時,那麼傳送訊號sigurg。在和中bsd非同步i/o部分,可以看到在fcntl中使用f_setown命令來設定乙個套接字的所有權。如果fcntl中第三個引數為正值,那麼指定了程序id;如果為非-1的負值,那麼(該負值的絕對值)代表了程序組id。因此,通過呼叫以下函式,可以安排程序接收乙個套接字訊號。
fcntl(sockfd, f_setown, pid);
f_getown命令可以用來獲得當前套接字所有權。對於f_setown命令,乙個負值代表乙個程序組id,乙個正值代表程序id。因此,呼叫
owner = fcntl(sockfd, f_getown, 0);
返回值owner,如果owner為正值,則owner等於配置為接受套接字訊號的程序id;如果owner為負值,則其絕對值為接受套接字訊號的程序組id。
tcp支援緊急標記(urgent mark)的概念:在普通資料流中緊急資料所在的位置。如果採用套接字選項so_oobinline,那麼可以在普通資料中接收緊急資料。為幫助判斷是否接收到緊急標記,可以使用函式sockatmark。
#include
int sockatmark(int sockfd);
返回值:若在標記出則返回1,若沒有在標記出則返回0,出錯則返回-1
當帶外資料出現在套接字讀取佇列時,select函式(會返回乙個檔案描述符並且擁有乙個異常狀態掛起。可以在普通資料流上接受緊急資料,或者在某個recv函式中採用msg_oob標誌在其他佇列資料之前接收緊急資料。tcp佇列僅有乙個位元組的緊急資料,如果在接收當前的緊急資料位元組之前又有新的緊急資料到來,那麼當前的位元組會被丟棄。
本篇博文內容摘自《unix環境高階程式設計》(第二版),僅作個人學習記錄所用。關於本書可參考:
APUE 網路IPC 套接字之套接字選項
套接字機制提供兩個套接字選項介面來控制套接字的行為。乙個介面用來設定選項,另乙個介面允許查詢乙個選項的狀態。可以獲取或設定的三種選項 1 通用選項,工作在所有套接字型別上。2 在套接字層次管理的選項,但是依賴於下層協議的支援。3 特定與某協議的選項,為每個協議所獨有。single unix spec...
網路IPC 套接字
1.套接字是通訊端點的抽象。與應用程式要用檔案描述符訪問檔案一樣,訪問套接字也需要用套接字描述符。套接字描述符在unix系統是用檔案描述符實現的。要建立乙個套接字,可以呼叫socket函式。include int socket int domain,int type,int protocol 返回值...
網路IPC 套接字
套接字描述符 includeint socket int domain,int type,int prootocol 返回值 若成功,返回檔案 套接字 描述符,若出錯,返回 1域 描述af inet ipv4 網際網路域 af inet6 ipv6網際網路域 af unix unix域 af ups...