socket() - Unix,Linux系统调用
广告
名称socket - 创建通信端点概要
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol); 描述
socket() 创建一个通信端点并返回一个描述符。domain 参数指定一个通信域;这将选择用于通信的协议族。这些族在 <sys/socket.h> 中定义。当前已知的格式包括:
名称 | 用途 | 手册页 |
| 本地通信 | |
| IPv4互联网协议 | |
| IPv6互联网协议 | |
| IPX - Novell协议 | |
| 内核用户界面设备 | |
| ITU-T X.25 / ISO-8208协议 | |
| 业余无线电AX.25协议 | |
| 访问原始ATM PVC | |
| Appletalk | |
| 低级分组接口 | |
套接字具有指示的type,它指定通信语义。当前定义的类型为:
标签 | 描述 |
SOCK_STREAM | | 提供有序的、可靠的、双向的、基于连接的字节流。可能支持带外数据传输机制。 |
SOCK_DGRAM | | 支持数据报(无连接的、不可靠的、长度固定的最大消息)。 |
SOCK_SEQPACKET | | 为长度固定的数据报提供有序的、可靠的、双向的基于连接的数据传输路径;使用者需要在每次读取系统调用时读取整个数据包。 |
SOCK_RAW | | 提供原始网络协议访问。 |
SOCK_RDM | | 提供一个可靠的数据报层,但不保证排序。 |
SOCK_PACKET | | 已过时,不应在新程序中使用;参见packet(7)。 |
并非所有协议族都实现某些套接字类型;例如,SOCK_SEQPACKET未在AF_INET中实现。protocol 指定与套接字一起使用的特定协议。通常只有一个协议支持给定协议族内的特定套接字类型,在这种情况下,protocol 可以指定为 0。但是,可能存在许多协议,在这种情况下,必须以这种方式指定特定协议。要使用的协议号特定于发生通信的“通信域”;参见protocols(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信号。此操作也可用于设置通过SIGIO接收I/O和I/O事件异步通知的进程或进程组。使用F_SETOWN等效于使用FIOSETOWN或SIOCSPGRP参数的ioctl(2)调用。 当网络向协议模块发出错误条件信号(例如,对IP使用ICMP消息)时,将为套接字设置挂起的错误标志。对该套接字的下一个操作将返回挂起错误的错误代码。对于某些协议,可以启用每个套接字错误队列以检索有关错误的详细信息;请参见ip(7)中的IP_RECVERR。 套接字的操作由套接字级别的选项控制。这些选项在<sys/socket.h>中定义。函数setsockopt(2)和getsockopt(2)分别用于设置和获取选项。 返回值成功时,返回新套接字的文件描述符。出错时,返回-1,并相应地设置errno。错误
标签 | 描述 |
EACCES | 拒绝创建指定类型和/或协议的套接字的权限。 |
EAFNOSUPPORT | | 实现不支持指定的地址族。 |
EINVAL | 未知协议,或协议族不可用。 |
EMFILE | 进程文件表溢出。 |
ENFILE | 已达到打开文件的系统限制。 |
ENOBUFS或ENOMEM | | 可用内存不足。套接字必须在释放足够的资源后才能创建。 |
EPROTONOSUPPORT | | 此域不支持协议类型或指定的协议。 |
底层协议模块可能会生成其他错误。符合标准4.4BSD,POSIX.1-2001。socket() 出现在 4.2BSD 中。它通常可以移植到/从支持 BSD 套接字层克隆的非 BSD 系统(包括 System V 变体)。注释在 4.x BSD 下使用的协议族的显式常量是 PF_UNIX、PF_INET 等,而 AF_UNIX 等用于地址族。但是,BSD 手册页已经承诺:“协议族通常与地址族相同”,随后的标准在任何地方都使用 AF_*。缺陷
尚未实现SOCK_UUCP。参见
4.3BSD进程间通信入门教程\(rq转载于《UNIX程序员补充文档卷1》。
\(lqBSD进程间通信教程\(rq转载于《UNIX程序员补充文档卷1》。
广告
|