Provided by: manpages-zh_1.6.3.6-1_all bug

名字

       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> 中定義。
       目前已知的格式包括:

       名稱                 目的:手冊頁
       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) 中關於如何把協議名稱字串與協議編號進行對映。

       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_DGRAMSOCK_RAW 型別的套接字支援用  sendto(2)  系統呼叫來發送資料報,資料報通常是用
       recvfrom(2), 來接受的,這個呼叫會在下一個資料報中單獨的返回傳送者的地址。

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

       fcntl(2) 的 F_SETOWN 操作可以在帶外資料到達時讓程序或程序組會收到一個 SIGURG  訊號,或者在
       SOCK_STREAM  型別的連線在被不期望地打斷時,收到 SIGPIPE 訊號。這個操作也可能被用於讓程序或
       程序組透過 SIGIO.  接收 I/O 和 I/O 不同步的通知。使用 F_SETOWN 等同於使用了  FIOSETOWNSIOCSPGRP 引數的 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 已經達到系統上限的檔案開啟數。

       ENOBUFSENOMEM
              沒有足夠的記憶體,直到有可用的資源套接字不能被建立。

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

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

相容性

       4.4BSD, POSIX.1-2001.

       SOCK_NONBLOCKSOCK_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