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_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