名称

套接字-创建通信端点

备注

POSIX.1不需要包含,并且在Linux上不需要此头文件。但是,某些历史(BSD)实现需要此头文件,而可移植的应用程序最好将其包括在内。

在4.x BSD下,协议族使用的清单常量为PF_UNIX,PF_INET等,而AF_UNIX,AF_INET等用于地址族。但是,BSD手册页已经承诺:"协议族通常与地址族相同",随后的标准到处都使用AF_ *。

语法

#include <sys/types.h>/* 请参阅注释 */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

返回值

成功后,将返回新套接字的文件描述符。如果出错,则返回-1,并正确设置errno。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

SOCKET - Linux手册页

Linux程序员手册 第2部分
更新日期: 2020-06-09

另外参见

accept(2),bind(2),close(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),address_families(7),ip(7), socket(7),tcp(7),udp(7),unix(7)

lqAn入门4.3BSD进程间通信教程rq和lqBSD进程间通信教程rq,在UNIX程序员补充文档第1卷中转载。

错误说明

EACCES
创建指定类型和/或协议的套接字的权限被拒绝。
EAFNOSUPPORT
该实现不支持指定的地址族。
EINVAL
未知协议或协议族不可用。
EINVAL
类型无效的标志。
EMFILE
已达到打开文件描述符数量的每个进程限制。
ENFILE
已达到系统范围内打开文件总数的限制。
ENOBUFSor ENOMEM
可用的内存不足。只有释放足够的资源,才能创建套接字。
EPROTONOSUPPORT
该域不支持协议类型或指定的协议。

基础协议模块可能会生成其他错误。

说明

socket()创建一个用于通信的端点,并返回引用该端点的文件描述符。成功调用返回的文件描述符将是当前未为该进程打开的编号最小的文件描述符。

domain参数指定通信域;这将选择将用于通信的协议系列。这些族在中定义。 Linux内核当前可理解的格式包括:

NamePurposeMan page
AF_UNIXLocal communicationunix(7)
AF_LOCALSynonym forAF_UNIX
AF_INETIPv4 Internet protocolsip(7)
AF_AX25Amateur radio AX.25 protocolax25(4)
AF_IPXIPX - Novell protocols
AF_APPLETALKAppleTalkddp(7)
AF_X25ITU-T X.25 / ISO-8208 protocolx25(7)
AF_INET6IPv6 Internet protocolsipv6(7)
AF_DECnetDECet protocol sockets
AF_KEYKey management protocol, oroirnally developed for usage with IPsec
AF_NETLINKKernel user interface devicenetlink(7)
AF_PACKETLow-level packet interfacepacket(7)
AF_RDSReliable Datagram Sockets (RDS) protocolrds(7)
rds-rdma(7)
AF_PPPOXGeneric PPP transport layer, for setting up L2 tunnels(L2TP and PPPoE)
AF_LLCLogical link control (IEEE 802.2 LLC) protocol
AF_IBInfiniBand native addressing
AF_MPLSMultiprotocol Label Switching
AF_CANController Area Network automotive bus protocol
AF_TIPCTIPC, "cluster domain sockets" protocol
AF_BLUETOOTHBluetooth low-level socket protocol
AF_ALGInterface to kernel crypto API
AF_VSOCKVSOCK (oroirnally "VMWare VSockets") protocolfor hypervisor-guest communicationvsock(7)
AF_KCMKCM (kernel connection multiplexer) interface
AF_XDPXDP (express data path) interface

可以在address_families(7)中找到上述地址族的更多详细信息以及其他几个地址族的信息。

套接字具有指示的类型,该类型指定通信语义。当前定义的类型是:

SOCK_STREAM
提供顺序的,可靠的,双向的,基于连接的字节流。可以支持带外数据传输机制。
SOCK_DGRAM
支持数据报(固定长度的无连接,不可靠消息)。
SOCK_SEQPACKET
为固定最大长度的数据报提供有序的,可靠的,基于双向连接的数据传输路径;消费者需要在每次输入系统调用时读取整个数据包。
SOCK_RAW
提供原始网络协议访问。
SOCK_RDM
提供不保证排序的可靠数据报层。
SOCK_PACKET
已过时,不应在新程序中使用;参见数据包(7)。

某些套接字类型可能并非所有协议家族都实现。

从Linux 2.6.27开始,type参数具有第二个目的:除了指定套接字类型,它还可以包含以下任意值的按位"或",以修改socket()的行为:

SOCK_NONBLOCK
在新文件描述符引用的打开文件描述(请参见open(2))上设置O_NONBLOCK文件状态标志。使用此标志可以节省对fcntl(2)的额外调用,以实现相同的结果。
SOCK_CLOEXEC
在新文件描述符上设置执行时关闭(FD_CLOEXEC)标志。有关为什么可能有用的原因,请参见open(2)中O_CLOEXEC标志的描述。

该协议指定要与套接字一起使用的特定协议。通常,在给定协议族中,只有一个协议可以支持特定的套接字类型,在这种情况下,协议可以指定为0。但是,可能存在许多协议,在这种情况下,必须在其中指定一个特定的协议。方式。使用的协议号特定于要进行通信的``通信域'';参见协议(5)。有关如何将协议名称字符串映射到协议编号的信息,请参见getprotoent(3)。

SOCK_STREAM类型的套接字是全双工字节流。它们不保留记录边界。流套接字必须处于连接状态,然后才能在其上发送或接收任何数据。通过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信号。此操作还可用于设置通过SoirO接收I / O和I / O事件的异步通知的进程或进程组。使用F_SETOWN等效于使用FIOSETOWN或SIOCSPGRP参数的ioctl(2)调用。

当网络向协议模块发出错误情况信号时(例如,使用IP的ICMP消息),将为套接字设置待处理的错误标志。此套接字上的下一个操作将返回未决错误的错误代码。对于某些协议,可以启用每个套接字的错误队列以检索有关该错误的详细信息。请参阅ip(7)中的IP_RECVERR。

套接字的操作由套接字级别选项控制。这些选项在中定义。函数setsockopt(2)和getsockopt(2)用于设置和获取选项。

遵循规范

POSIX.1-2001,POSIX.1-2008、4.4BSD。

SOCK_NONBLOCK和SOCK_CLOEXEC标志是特定于Linux的。

socket()出现在4.2BSD中。它通常可移植到支持BSD套接字层克隆(包括System V变体)的非BSD系统中或从中移植出来。

示例

getaddrinfo(3)中显示了使用socket()的示例。

日期:2019-08-20 17:59:27 来源:oir作者:oir