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)
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 的套接字的套接字選項:
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 |