#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
socket() 建立一個用於交流的端點並且返回一個描述符。
The domain 引數指定一個通訊域名;選擇的協議將會用於通訊。協議名在 <sys/socket.h> 中定義。 目前已知的格式包括:
| 名稱 | 目的:手冊頁 |
| AF_UNIX ", " 本地通訊: | unix(7) | unix (7) |
| AF_INET | IPv4 網路協議 | ip (7) |
| AF_INET6 | IPv6 網路協議 | ipv6 (7) |
| AF_IPX | IPX - Novell 協議 |
| AF_NETLINK | 核心使用者介面裝置 | netlink (7) |
| AF_X25 | ITU-T X.25 / ISO-8208 協議 | x25 (7) |
| AF_AX25 | Amateur radio AX.25 protocol |
| AF_ATMPVC | Access to raw ATM PVCs |
| AF_APPLETALK | Appletalk | ddp (7) |
| AF_PACKET | 底層包連線 | packet (7) |
套接字透過 type, 引數來確定通訊語義。目前定義的型別有:
- SOCK_STREAM
- 提供有序的,可靠的,雙向的,基於位元組流的通訊。可能支援帶外傳輸。
- SOCK_DGRAM
- 提供資料報(不面向連線的, 不可靠的固定最大長度的資訊)。
- SOCK_SEQPACKET
- 提供有序的,可靠的,雙向的,基於固定最大長度的資料報傳輸路徑;需要一個讀取整個伴有輸入系統呼叫的包的使用者。
- SOCK_RAW
- 提供未加工(raw)的網路協議通道。
- SOCK_RDM
- 提供可靠的資料報層,但是不保證順序。
- SOCK_PACKET
- 廢棄的,不應該在新的程式中使用,參考 packet(7)。
一些套接字型別並未被所有的協議實現; 例如, SOCK_SEQPACKET 並不被 AF_INET AF_INET 實現。
從 Linux 2.6.27 開始, type 引數可以提供其他的功能: 注意一些套接字型別可能包括一下值的或位,用來修改 socket(): 的行為。
- SOCK_NONBLOCK
- 設定 O_NONBLOCK 的標誌於新開啟的檔案描述符。 透過這個標誌可以不用呼叫 fcntl(2) 來達到相同的結果。
- SOCK_CLOEXEC
- 設定 close-on-exec (FD_CLOEXEC) 的標誌於新開啟的檔案描述符。參見 open(2) 中關於 O_CLOEXEC 的描述,因為一些原因這個標誌很有用。
protocol 指定一個協議用於套接字。指定一個協議用於套接字。一般情況下,在給定的協議中只允許在一個套接字上使用一個協議, 注意 protocol 可以指定為數字0 。 但是,可能存在著很多協議,但是在本手冊的協議必須使用一個。協議用於指定通訊發生地方的“通訊域名”,參考 protocols(5) 。參考 getprotoent(3)EN 中關於如何把協議名稱字串與協議編號進行對映。
SOCK_STREAM 型別的套接字是雙向直接資料流的,和管道十分相似。他們不對記錄溢位提供保護。一個套接字流在接受或發出任何資料時必須處於 connected 的狀態。和其它套接字透過 connect(2)EN 呼叫來建立連線。 一旦連線, 資料可能透過 read(2) 和 write(2) 系統呼叫來傳輸,也或者是不同的 send(2) 和 recv(2)EN 系統呼叫。當會話結束時,可能會執行 close(2) 帶外資料可能也用 send(2) 和 recv(2)EN 描述與接受。
SOCK_STREAM 型別的的通訊協議應確保資訊不丟失與重複。如果一塊有協議緩衝的資料不能在合理時間內傳輸,連線會被認為超時。當在套接字上啟用 SO_KEEPALIVE ,協議會以其特定方式檢查另一端是否活著。當一個程序接受或傳送了一個錯誤的資料流, 會產生並接受一個 SIGPIPE 訊號;對於採取預設處理此訊號的程序, 它將會退出。 SOCK_SEQPACKET 套接字採用和 SOCK_STREAM
套接字相同的系統呼叫。唯一不同的是, read(2) 系統呼叫只會返回請求的資料量,並將餘下到達的任何資料資料包丟棄。此外所有的訊息邊界的傳入的資料報將被保留。
SOCK_DGRAM 和 SOCK_RAW 型別的套接字支援用 sendto(2)EN 系統呼叫來發送資料報,資料報通常是用 recvfrom(2)EN, 來接受的,這個呼叫會在下一個資料報中單獨的返回傳送者的地址。
SOCK_PACKET 是一個遺留的套接字型別,用來從裝置驅動中接受原始資料,已經被 packet(7) 呼叫取代。
fcntl(2)EN 的 F_SETOWN 操作可以在帶外資料到達時讓程序或程序組會收到一個 SIGURG 訊號,或者在 SOCK_STREAM 型別的連線在被不期望地打斷時,收到 SIGPIPE 訊號。這個操作也可能被用於讓程序或程序組透過 SIGIO. 接收 I/O 和 I/O 不同步的通知。使用 F_SETOWN 等同於使用了 FIOSETOWN 或 SIOCSPGRP 引數的 ioctl(2)EN 系統呼叫。
當網路向協議模型發出一個錯誤情況的訊號(例如,對IP使用ICMP訊息),套接字將會設定上pending錯誤標誌。對套接字接下去的操作將會返回pending錯誤的錯誤程式碼。對於一些協議,可能會為每一個接字接啟用一個用於取出詳細錯誤資訊的錯誤列隊; 參見 ip(7) 中的 IP_RECVERR 。
套接字的操作由套接字級的 選項 來控制。 這些選項定義於 <sys/socket.h> 中。 setsockopt(2)EN和 setsockopt(2)EN 用於分別用於設定和讀取選項。
成功時,會返回新套接字的檔案描述符。錯誤時,返回 -1 ,同時 errno 會被適當設定。
4.4BSD, POSIX.1-2001.
SOCK_NONBLOCK 和 SOCK_CLOEXEC 標誌是 Linux 特有的。 socket() appeared in 4.2BSD. 出現於 4.2BSD 。通常,非 BSD 系統的 BSD 套接字層克隆是可移植的(包括 System V 的變種)。
並不要求包含 <sys/types.h> ,這個標頭檔案在Linux下是不必須的。 可是一些歷史上的 (BSD) 工具要求這個標頭檔案,可移植程式很可能希望包含它。 4.x BSD下明顯固定的協議組有 PF_UNIX, PF_INET, 等等,但是AF_UNIX等,它們是用於地址組的。可是BSD的man page保證“協議組一般等於地址組”,隨後的標準在每個地方都使用了 AF_* 。
<sys/types.h> 檔案頭只在libc4以前是必須的。一些包,如util-linux,claim,是用於在所以Linux版本和庫上可移植的。它們確實需要這個標頭檔案。
accept(2), bind(2), connect(2)EN, fcntl(2)EN, getpeername(2)EN, getsockname(2)EN, getsockopt(2)EN, ioctl(2)EN, listen(2), read(2), recv(2)EN, select(2)EN, send(2), shutdown(2)EN, socketpair(2)EN, write(2), getprotoent(3)EN, ip(7), socket(7), tcp(7), udp(7), unix(7)
“An Introductory 4.3BSD Interprocess Communication Tutorial” 在 中被重印。
“BSD Interprocess Communication Tutorial” 在 UNIX Programmer's Supplementary Documents Volume 1 中被重印。
This page is part of release 3.27 of the Linux man-pages project. A description of the project, and information about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/. 譯者於2011-07-26翻譯,於2013-02-08修訂 譯文與原文的版權協議一致
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh