套接字機制提供兩個套接字選項介面來控制套接字的行為。乙個介面用來設定選項,另乙個介面允許查詢乙個選項的狀態。可以獲取或設定的三種選項:
(1)通用選項,工作在所有套接字型別上。
(2)在套接字層次管理的選項,但是依賴於下層協議的支援。
(3)特定與某協議的選項,為每個協議所獨有。
single unix specification僅定義了套接字層的選項(上述三種選項中的前兩種選項)。
可以採用setsockopt函式來設定套接字選項。
#include
intsetsockopt
(int sockfd,
int level, in option,
const
void
*val, socklen_t len)
;返回值:若成功則返回0,出錯則返回-
1
引數level標識了選項(option)應用的協議。如果選項(option)是通用的套接字層選項,level設定成sol_socket。否則,level設定成控制這個選項的協議號。例如,對於tcp選項,這是ipproto_tcp,對於ip選項,這是ipproto_ip。表16-10總結了single unix specification所定義的通用套接字層的選項。
表16-10 套接字選項
引數val根據選項(option)的不同指向乙個資料結構或乙個整數。一些選項是on/off開關。如果整數非零,那麼選項(option)被啟用。如果整數為零,那麼選項(option)被禁止。引數len指定了val指向的物件的大小。
可以使用getsockopt函式來發現選項的當前值。
#include
intgetsockopt
(int sockfd,
int level,
int option,
void
*restrict val, socklen_t *restrict lenp)
;返回值:若成功則返回0,出錯則返回-
1
注意引數lenp是乙個指向整數的指標。在呼叫getsockopt之前,設定該整數為複製選項緩衝區的大小。如果實際的尺寸大於此值,選項會被截斷而不報錯;如果實際尺寸正好等於或者小於此值,那麼返回時將此值更新為實際尺寸。
例項當伺服器終止並嘗試立即重啟時,程式清單16-3中的函式不會正常工作。除非超時(這通常約為幾分鐘),通常tcp的實現不允許繫結同乙個位址。幸運的是套接字選項so_reuseaddr允許越過這個限制,如程式清單16-9所示。
#include
"apue.h"
#include
#include
intinitserver
(int type,
const
struct sockaddr *addr, socklen_t alen,
int qlen)if(
bind
(fd, addr, alen)
<0)
if(type == sock_stream || type == sock_seqpacket)
}return
(fd)
;errout:
close
(fd)
; errno = err;
return(-
1);}
為了啟用so_reuseaddr選項,在setsockopt中val的引數設定為乙個非零整數的位址。設定len引數為val所指的物件的大小。
本篇博文內容摘自《unix環境高階程式設計》(第二版),僅作個人學習記錄所用。關於本書可參考:
APUE 網路IPC 套接字之帶外資料
帶外資料 out of band data 是一些通訊協議所支援的可選特徵,允許更高優先順序的資料比普通資料優先傳輸。即使傳輸佇列已經有資料,帶外資料先行傳輸。tcp支援帶外資料,但是udp不支援。套接字介面對帶外資料的支援,很大程度受tcp帶外資料具體實現的影響。tcp將帶外資料稱為 緊急 資料 ...
網路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...