通訊端機制提供了兩個通訊端選項介面來控制通訊端的行為。一個介面用來設定選項,另外一個介面用來允許我們請求選項的狀態。我們可以獲得以及設定三種類型的選項。
1.通用選項,可以工作在所有的通訊端類型。
2.在通訊端層次上面進行管理的選項,但是依賴底部協議的支援。
3.和每個協議相關的協議選項。
Single UNIX Specification 只定義了通訊端層的選項(上面所提到的前面兩項)
我們可以通過setsockopt函數來設定通訊端選項。
#include <sys/socket.h>
int setsockopt(int sockfd, int level, int option, const void *val, socklen_t len);
返回:如果成功返回0,如果錯誤返回1。
參數level用來分辨option所應用的協議。如果option是通用通訊端層次的選項,那麼level設定成SOL_SOCKET。否則level設定成控制option的協議號。例如IPPROTO_TCP用於TCP選項,以及IPPROTO_IP用於IP選項。下面的表中就列出了Single UNIX Specification定義的通用的通訊端層次的選項。
通訊端選項
+-------------------------------------------------------------------------------------------------------------+
| Option | Type of val argument | Description |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_ACCEPTCONN | int | 返回通訊端是否啟用用於偵聽(只用於getsockopt)。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_BROADCAST | int | 如果*val非0那麼廣播資料報。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_DEBUG | int | 如果*val非0那麼啟用網路驅動的調試。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_DONTROUTE | int | 如果*val非0,那麼忽略通常的路由。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_ERROR | int | 返回並且清除提交的通訊端錯誤(只用於getsockopt)。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_KEEPALIVE | int | 如果*val非0,那麼啟用定期活動的訊息。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_LINGER | struct linger | 如果有未發送的訊息存在以及通訊端關閉,那麼做延遲。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_OOBINLINE | int | 如果*val非0,那麼將帶外資料嵌入到正常資料中。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_RCVBUF | int | 接收緩衝的位元組大小。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_RCVLOWAT | int | receive調用返回的最小資料位元組。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_RCVTIMEO | struct timeval | 通訊端receive調用的逾時值。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_REUSEADDR | int | 如果*val非0,那麼重複使用bind的地址。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_SNDBUF | int | send緩衝中的位元組大小。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_SNDLOWAT | int | 一次send調用傳輸的最小資料位元組量。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_SNDTIMEO | struct timeval | 一個通訊端send調用的逾時值。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_TYPE | int | 辨別通訊端類型(只在getsockopt中)。 |
+-------------------------------------------------------------------------------------------------------------+