SOCKET(7)

NAME
socket - Linux 套接字

總覽
#include <sys/socket.h>
mysocket = socket(int socket_family, int socket_type, int protocol);

描述
本手冊頁介紹了 Linux 套接字的用戶接口. 這個 BSD 兼容套接字是介於用 戶進程與內核網絡協議棧之間的統一接口, 各協議模塊屬於不同的 協議族 ,如 PF_INET, PF_IPX, PF_PACKET 和 套接字類型 ,如 字節流（SOCK_STREAM） 或 數據報（SOCK_DGRAM）. 關於協議族和套接字類型請參考 socket(2).

套接層函數
用戶通過這些套接字函數發送和接收包, 以及其他套接字操作. 詳細說明參看他們各自的手冊頁. socket(2) 創建套接字，

connect(2) 與遠程套接字地址建立連接

bind(2) 把套接字和一個本地套接字地址綁定在一起（爲套接字分配一個本地協議地址）

listen(2) 通知套接字接受新的連接

accept(2) 爲新的已完成連接獲得新的描述字

socketpair(2) 返回兩個連接的匿名套接字（僅在某些本地族中才有實現,如 PF_UNIX）

send(2),

sendto(2), 和 sendmsg(2) 通過套接字發送數據，而 recv(2), recvfrom(2), recvmsg(2) 從套接字接收數據. poll(2) 和

select(2) 等待數據到來或準備好接收數據. 除此之外, 標準 I/O 操作如 write(2), writev(2), sendfile(2), read(2), 和 readv(2) 也可用來讀入（接收）和寫出（發送）數據.

getsockname(2) 用於獲得本地套接字地址

getpeername(2) 用於獲得遠端套接字地址. getsockopt(2) 和 setsockopt(2) 用於設置或取得套接字或協議選項. ioctl(2) 也可以用來設置或讀取一些其他選項.

close(2) 關閉套接字. shutdown(2) 關閉全雙工套接字連接的一部分.

套接字不支持搜索，也不支持調用 pread(2) 或 pwrite(2) 進行非 0 位置的操作. 可以用 fcntl(2). 設置 O_NONBLOCK 標誌來實現對套接字的非阻塞 I/O 操作 O_NONBLOCK 是從 accept 繼承來的，然後原來所有會阻塞的操作會返回 EAGAIN. connect(2) 在此情況下返回 EINPROGRESS 錯誤. 用戶可以通過 poll(2) 或者 select(2) 等待各種事件.

I/O 事件
事件 | 輪詢標誌 | 發生事件
讀 | POLLIN | 新數據到達.
讀 | POLLIN | (對面向連接的套接字)建立連接成功
讀 | POLLHUP | 另一端套接字發出斷開連接請求.
讀 | POLLHUP | (僅對面向連接協議)套接字寫的時候連接斷開. 同時發送
寫 | POLLOUT | 套接字有充足的發送緩衝區用於寫入新數據.
讀/寫 | POLLIN| POLLOUT | 發出的 結束.
讀/寫 | POLLERR | 產生一個異步錯誤.
讀/寫 | POLLHUP | 對方已經單向關閉連接.
例外 | POLLPRI | 緊急數據到達.然後發送

另外一個的 poll/select 方法是讓內核用 SIGIO 信號來通知應用程序. 要這麼用的話你必須用 fcntl(2) 設置套接字文件描述符的 FASYNC 標誌，並用 sigaction(2). 給 SIGIO 信號設置一個的有效信號處理句柄.參看下面的 SIGNALS 的討論.

套接字選項
套接字選項可以用 setsockopt(2) 來設置，用 getsockopt(2) 讀取所有套接字級別設爲 SOL_SOCKET 的套接字的套接字選項:

SO_KEEPALIVE
    允許在面向連接的套接字上發送 keep-alive 消息的功能.是一個布爾整數.

SO_OOBINLINE
    如果打開這個選項，帶外（Out-of-Band）數據可以直接放入接收數據流。 否則，只有接收時打開 MSG_OOB 標誌, 才接收帶外數據.

SO_RCVLOWAT 和 SO_SNDLOWAT
    聲明在開始向協議 (SO_SNDLOWAT) 或正在接收數據的用戶 (SO_RCVLOWAT). 傳遞數據之前緩衝區內的最小字節數. 在 Linux 中這兩個值是不可改變的, 固定爲 1 字節. 可以用 getsockopt 用來讀取它們的值; setsockopt 總是返回 ENOPROTOOPT.

SO_RCVTIMEO 和 SO_SNDTIMEO
    發送和接收時的超時設定, 並在超時時報錯. 在 Linux 中由 協議指定, 不能被讀寫. 它們的功能可用 alarm(2) 或者 setitimer(2). 來模擬.

SO_BSDCOMPAT
    允許 BSD 的 bug-to-bug 兼容. 這一項只能在 UDP 協議模塊中使用而 且今後將要取消. 如果允許的話, UDP 套接字接收到的 ICMP 錯誤將不 會被傳送至用戶程序. Linux 2.0 中對於原始套接字也允許 BSD bug-to-bug 兼容（報頭隨機改變,省略廣播標識）,但在 Linux 2.2 中取消了這一項. 修改用戶程序的方式比較好.

SO_PASSCRED
    允許或關閉 SCM_CREDENTIALS 控制消息的接收. 更多信息參見 unix(7).

SO_PEERCRED
    返回連接至此套接字的外部進程的身份驗證. 只在 PF_UNIX 套接字中有用.參見 unix(7). 參數爲 ucred 結構.只在 getsockopt. 中有效.

SO_BINDTODEVICE
    將此套接字綁定到一個特定的設備上, 如“eth0”, 做爲指定的接口名字傳遞. 如果名稱是空字符串或此項長度爲 0, 則套接字設備綁定被取消. 過去的選項是一個變長的空零結尾的 接口名稱的字符串, 其最大長度爲 IFNAMSIZ. 如果一個套接字被綁定至一接口, 只有由這個特定接口接收的信息包可以由此套接字處理.

SO_DEBUG
    允許套接字調試.只對有 CAP_NET_ADMIN 功能或有效用戶標識爲 0 的進程有效.

SO_REUSEADDR
    表示在一個 bind(2) 調用中對提供給它的地址使用的確認規則應該允許重複使用本地地址. 對於 PF_INET 套接字, 這表示該套接字可以綁定, 除非已有一個活躍的偵聽套 接口綁定到此地址上. 如果這個偵聽套接字和一個指定端口綁定爲 INADDR_ANY 時, 它就不能再綁定到任何本地地址的此端口.

SO_TYPE
    按整數返回套接字類型（如 SOCK_STREAM） 只能通過 getsockopt 讀取.

SO_DONTROUTE
    不通過網關發送, 只能發送給直接連接的主機.可以通過在套接字的 send(2) 操作上設置 MSG_DONTROUTE 標誌來實現相同的效果. 其值爲布爾型整數的標識.

SO_BROADCAST
    設置或獲取廣播標識. 當選擇此選項時, 數據報套接字接收向 廣播地址發送的數據包, 並且可以向廣播地址發送數據包. 這一 選項對於面向流的套接字無效.

SO_SNDBUF
    設置或得到套接字發送緩衝區的最大字節數. 其默認值由 wmem_default sysctl 設置,最大允許值由 wmem_max sysctl 設置.

SO_RCVBUF
    設置或得到套接字接收緩衝區的最大字節數。其默認值由 rmem_default sysctl設置,最大允許值由 rmem_max sysctl 設置.

SO_LINGER
    設置或獲取 SO_LINGER 選項的值. 其參數爲 linger 結構.

    struct linger {
    	int	l_onoff;	/* 延時狀態（打開/關閉） */
    	int	l_linger;	/* 延時多長時間 */
    };

    如果選擇此選項, close(2) 或 shutdown(2) 將等到所有套接字裏排隊的消息成功發送或到達延遲時間後 纔會返回. 否則, 調用將立即返回. 而 closing 操作將在後臺 進行. 如果套接字是 exit(2), 的一部分關閉時, 它總是在後臺延遲進行的.

SO_PRIORITY
    設置在此套接字發送的所有包的協議定義優先權. Linux 通過這一值來排列網絡隊列: 根據所選設備排隊規則, 具有更高優先權的包可以先被處理.對於 ip(7), 同時也設置了輸出包的 IP 服務類型（TOS）的域.

SO_ERROR
    取得並清除未解決的套接字錯誤. 只有在 getsockopt. 時有效. 是一個整數值.

SIGNALS
當向一個已關閉（被本地或遠程終端）的面向聯接的套接字寫入時, 將向該寫入進程發送 SIGPIPE 信號，並返回 EPIPE 如果寫入命令聲明瞭 MSG_NOSIGNAL 標識時, 不會發出此信號.

如果與 FIOCSETOWN fcntl 或 SIOCSPGRP ioctl 一起請求，那麼當發生 I/O 事件時發出 SIGIO 這樣我們就可以在信號句柄裏使用 poll(2) 或 select(2) 找出發生事件的套接字. 另一種選擇（在 Linux 2.2 中）是用 F_SETSIG fcntl 設置一個實時信號: 實時信號的處理程序被調用時還會收到它的 siginfo_t 的 si_fd 區域中的文件描述符. 更多信息參見 fcntl(2)

在某些環境中（例如:多個進程訪問單個套接字）, 引發 SIGIO 的東西在進程對信號作出反應時可能已經消失了. 如果這樣的話, 進程應該再次等待, 因爲 Linux 稍後會重發此信號.

SYSCTLS
可以通過目錄 /proc/sys/net/core/* 下的文件或者用 sysctl(2) 系統調用來訪問內核套接字的網絡系統控制（sysctl）信息.

rmem_default
    指明套接字接收緩衝區的默認字節數.

rmem_max
    指明套接字接收緩衝區的最大字節數, 用戶可以通過使用 SO_RCVBUF 套接字選項來設置此值.

wmem_default
    指明套接字發送緩衝區的默認字節數.

wmem_max
    指明發送緩衝區的最大字節數，用戶可以通過使用套接字的 SO_SNDBUF 選項來設置它的值.

message_cost 和 message_burst
    設定記號存儲桶過濾器, 在存儲桶中保存一定數量的外部網絡 事件導致的警告消息.

netdev_max_backlog
    在全局輸入隊列中包的最大數目.

optmem_max
    每個套接字的象 iovecs 這樣的輔助數據和用戶控制數據的最大長度.

IOCTLS
以上的 IO 控制值可以通過 ioctl(2) 來訪問:
    error = ioctl(ip_socket, ioctl_type, &value_result);

SIOCGSTAMP
    返回 timeval 類型的結構，其中包括有發送給用戶的最後一個包接收時的時間戳。 被用來測量精確的 RTT （round trip time） 時間. struct timeval. 結構說明請參考 setitimer(2)

SIOCSPGRP
    在異步 IO 操作結束或者接收到緊急數據時，用來設置進程或進程組， 向它（它們）發送 SIGIO 或者 SIGURG 信號, 參數爲指向 pid_t. 類型的指針。如果參數爲正，則發送信號到相應的進程。如果參數爲 負，則發送信號到此參數絕對值 id 所屬的進程組的所有進程。 如果它沒有 CAP_KILL 功能或者它的有效 UID 不是 0, 進程只能選擇它自己或自己的進程組來 接收信號.

FIOASYNC
    改變 O_ASYNC 標誌來打開或者關閉套接字的異步 IO 模式。異步IO模式指的是：當 新的 I/O 事件發生時，將發出 SIGIO 信號或者用 F_SETSIG 設置的信號.

    參數爲整形布爾量.

SIOCGPGRP
    獲得當前接收 SIGIO 或者 SIGURG 信號的進程或者進程組, 如果兩個信號都沒有設置, 則爲 0.

有效的 fcntl:

FIOCGETOWN
    與 IO 控制中的 SIOCGPGRP 相同.

FIOCSETOWN
    與 IO 控制中的 SIOCSPGRP 相同.

注意
Linux 假設有一半的發送/接收緩衝區是用來處理內核結構, 因此, 系統控制的緩衝區是網絡可訪問的緩衝區的兩倍.

缺陷
CONFIG_FILTER 沒有介紹 SO_ATTACH_FILTER 和 SO_DETACH_FILTER 套接字選項. 在 libpcap 庫有此接口的說明

VERSIONS 版本
SO_BINDTODEVICE 在 Linux 2.0.30 中引入. SO_PASSCRED 是在 Linux 2.2 中引入的新選項. sysctl 是在 Linux 2.2. 中引入的新概念。

作者
本手冊頁由 Andi Kleen 編寫.

又見
socket(2), ip(7), setsockopt(2), getsockopt(2), packet(7), ddp(7)

[中文版維護人]
liguoping <liguoping_11@sina.com>

[中文版最新更新]
2000/11/06

《中國linux論壇man手冊頁翻譯計劃》:
http://cmpp.linuxforum.net

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh