SOCKET(7) | Linux Programmer's Manual | SOCKET(7) |
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)
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 的套接字的套接字選項:
struct linger { int l_onoff; /* 延時狀態(打開/關閉) */ int l_linger; /* 延時多長時間 */ };
當向一個已關閉(被本地或遠程終端)的面向聯接的套接字寫入時, 將向該寫入進程發送 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 稍後會重發此信號.
可以通過目錄 /proc/sys/net/core/* 下的文件或者用 sysctl(2) 系統調用來訪問內核套接字的網絡系統控制(sysctl)信息.
以上的 IO 控制值可以通過 ioctl(2) 來訪問:
error = ioctl(ip_socket, ioctl_type, &value_result);
有效的 fcntl:
Linux 假設有一半的發送/接收緩衝區是用來處理內核結構, 因此, 系統控制的緩衝區是網絡可訪問的緩衝區的兩倍.
CONFIG_FILTER 沒有介紹 SO_ATTACH_FILTER 和 SO_DETACH_FILTER 套接字選項. 在 libpcap 庫有此接口的說明
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
http://cmpp.linuxforum.net
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
7 May 1999 | Linux Man Page |