SOCKET(2)

名字
socket - 建立一個用於交流的端點

概要
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

描述
socket() 建立一個用於交流的端點並且返回一個描述符。

The domain 引數指定一個通訊域名；選擇的協議將會用於通訊。協議名在 <sys/socket.h> 中定義。 目前已知的格式包括：
名稱 | 目的：手冊頁
 | unix(7) |
 | IPv4 網路協議 |
 | IPv6 網路協議 |
 | IPX - Novell 協議
 | 核心使用者介面裝置 |
 | ITU-T X.25 / ISO-8208 協議 |
 | Amateur radio AX.25 protocol |
 | Access to raw ATM PVCs |
 | Appletalk |
 | 底層包連線 |

套接字通過 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) 中關於如何把協議名稱字串與協議編號進行對映。

SOCK_STREAM 型別的套接字是雙向直接資料流的，和管道十分相似。他們不對記錄溢位提供保護。一個套接字流在接受或發出任何資料時必須處於 connected 的狀態。和其它套接字通過 connect(2) 呼叫來建立連線。 一旦連線， 資料可能通過 read(2) 和 write(2) 系統呼叫來傳輸，也或者是不同的 send(2) 和 recv(2) 系統呼叫。當會話結束時，可能會執行 close(2) 帶外資料可能也用 send(2) 和 recv(2) 描述與接受。

SOCK_STREAM 型別的的通訊協議應確保資訊不丟失與重複。如果一塊有協議緩衝的資料不能在合理時間內傳輸，連線會被認為超時。當在套接字上啟用 SO_KEEPALIVE ，協議會以其特定方式檢查另一端是否活著。當一個程序接受或傳送了一個錯誤的資料流， 會產生並接受一個 SIGPIPE 訊號；對於採取預設處理此訊號的程序， 它將會退出。 SOCK_SEQPACKET 套接字採用和 SOCK_STREAM
 套接字相同的系統呼叫。唯一不同的是， read(2) 系統呼叫只會返回請求的資料量，並將餘下到達的任何資料資料包丟棄。此外所有的訊息邊界的傳入的資料包將被保留。

SOCK_DGRAM 和 SOCK_RAW 型別的套接字支援用 sendto(2) 系統呼叫來發送資料包，資料包通常是用 recvfrom(2), 來接受的，這個呼叫會在下一個資料包中單獨的返回傳送者的地址。

SOCK_PACKET 是一個遺留的套接字型別，用來從裝置驅動中接受原始資料，已經被 packet(7) 呼叫取代。

fcntl(2) 的 F_SETOWN 操作可以在帶外資料到達時讓程序或程序組會收到一個 SIGURG 訊號，或者在 SOCK_STREAM 型別的連線在被不期望地打斷時，收到 SIGPIPE 訊號。這個操作也可能被用於讓程序或程序組通過 SIGIO. 接收 I/O 和 I/O 不同步的通知。使用 F_SETOWN 等同於使用了 FIOSETOWN 或 SIOCSPGRP 引數的 ioctl(2) 系統呼叫。

當網路向協議模型發出一個錯誤情況的訊號（例如，對IP使用ICMP訊息），套接字將會設定上pending錯誤標誌。對套接字接下去的操作將會返回pending錯誤的錯誤程式碼。對於一些協議，可能會為每一個接字接啟用一個用於取出詳細錯誤資訊的錯誤列隊； 參見 ip(7) 中的 IP_RECVERR 。

套接字的操作由套接字級的 選項 來控制。 這些選項定義於 <sys/socket.h> 中。 setsockopt(2)和 setsockopt(2) 用於分別用於設定和讀取選項。

返回值
成功時，會返回新套接字的檔案描述符。錯誤時，返回 -1 ，同時 errno 會被適當設定。

錯誤

EACCES
    不允許建立指定的 型別 和/或 指定的協議的套接字。

EAFNOSUPPORT
    工具不支援指定的地址。

EINVAL
    未知協議，或協議組不可用。

EINVAL
    錯誤的 type 標誌。

EMFILE
    程序檔案表溢位。

ENFILE
    已經達到系統上限的檔案開啟數。

ENOBUFS 或 ENOMEM
    沒有足夠的記憶體，直到有可用的資源套接字不能被建立。

EPROTONOSUPPORT
    協議型別或指定的協議不被當前域所支援。

其它的錯誤可能是由協議模型產生的。

相容性
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版本和庫上可移植的。它們確實需要這個標頭檔案。

例子
在 getaddrinfo(3)。 中有一個使用 socket() 的例子。

參見
accept(2), bind(2), connect(2), fcntl(2), getpeername(2), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2), getprotoent(3), 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 中被重印。

COLOPHON
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