Scroll to navigation

SOCKET(7) Linux Programmer's Manual 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 (僅對面向連接協議)套接字寫的時候連接斷開. 同時發送 SIGPIPE.
POLLOUT 套接字有充足的發送緩沖區用於寫入新數據.
讀/寫 POLLIN| POLLOUT 發出的 connect (2) 結束.
讀/寫 POLLERR 產生一個異步錯誤.
讀/寫 POLLHUP 對方已經單向關閉連接.
例外 POLLPRI 緊急數據到達.然後發送 SIGURG.
.
.
.
.
.
.
.
另外一個的 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_RCVLOWATSO_SNDLOWAT
聲明在開始向協議 (SO_SNDLOWAT) 或正在接收數據的使用者 (SO_RCVLOWAT). 傳遞數據之前緩沖區內的最小字節數. 在 Linux 中這兩個值是不可改變的, 固定為 1 字節. 可以用 getsockopt 用來讀取它們的值; setsockopt 總是返回 ENOPROTOOPT.
SO_RCVTIMEOSO_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_tsi_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_costmessage_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_FILTERSO_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
7 May 1999 Linux Man Page