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