SOCKET(2) | Linux Programmer's Manual | 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> 中定義。 目前已知的格式包括:
名稱 | 目的:手冊頁 | |
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_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
2009-01-19 | Linux |