socket提供了兩個函數來控制socket行為, 一個用來設定選項, 一個用來查詢一個socket選項的狀態.
可以設定或查詢的三種選項是:
- 通用選項, 工作在所有socket類型上.
- 在socket層次管理的選項, 但是依賴於下層協議的支援.
- 特定協議選項.
1. 設定socket選項函數:
- 標頭檔: <sys/socket.h>
- 原型: int setsockopt(int sockfd, int level, int option, const void *val, socklen_t len);
- 傳回值: 成功則返回0, 出錯則返回-1.
- 參數:
- level: 標識了選項應用的協議(層).
- 如果是通用選項, level設定成SOL_SOCKET.
- 否則設定成控制這個選項的協議號, 例如:
- TCP: IPPROTO_TCP
- IP: IPPROTO_IP.
- option: socket選項. 具體查APUE 465頁表.
- val: 根據選項的不同指向一個struct或一個int.
- len: val指向的對象的大小.
2. 查詢socket選項函數:
- 標頭檔: <sys/socket.h>
- 原型: int getsockopt(int sockfd, int level, int option, void *restrict val, socklen_t *restrict lenp);
- 傳回值: 成功則返回0, 出錯則返回-1.
- 參數:
- lenp: 指向整數的指標. 在執行getsockopt之前, 設定該整數為儲存選項的緩衝區大小.
- 如果實際的尺寸大於此值, 選項會被截斷而不報錯.
- 如果實際的尺寸小於或等於此值, 傳回值將此值更新為實際尺寸.
附錄:
socket選項表
| 選項 |
參數val類型 |
描述 |
| SO_ACCEPTCONN |
int |
返回資訊指示該socket是否能監聽(僅getsockopt) |
| SO_BROADCAST |
int |
如果*val非0, 廣播資料包 |
| SO_DEBUG |
int |
如果*val非0, 啟用網路驅動調試功能 |
| SO_DONTROUTE |
int |
如果*val非0, 繞過通常路由 |
| SO_ERROR |
int |
返回掛起的socket錯誤並清楚(僅getsockopt) |
| SO_KEEPALIVE |
int |
如果*val非0, 啟用周期性keep-alive訊息 |
| SO_LINGER |
struct linger |
當有未發訊息並且socket關閉時, 延遲時間 |
| SO_OOBINLINE |
int |
如果*val非0, 將帶外資料放在普通資料中 |
| SO_RCVBUF |
int |
以位元組為單位的接收緩衝區大小 |
| SO_RCVLOWAT |
int |
接收調用中返回的以位元組為單位的最小資料量 |
| SO_RCVTIMEO |
struct timeval |
socket接收調用的逾時值 |
| SO_REUSEADDR |
int |
如果*val非0, 重用bind中的地址 |
| SO_SNDBUF |
int |
以位元組為單位的發送緩衝區大小 |
| SO_SNDLOWAT |
int |
發送調用中以位元組為單位的發送的最小資料量 |
| SO_SNDTIMEO |
struct timeval |
socket發送調用的逾時值 |
| SO_TYPE |
int |
標識socket類型(僅getsockopt) |