socket()函数的原型以下,这个函数创建一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。若是函数调用成功,会返回一个标识这个套接字的文件描述符,失败的时候返回-1。网络
#include<sys/types.h>
dom
#include<sys/socket.h>
socket
int socket(int domain, int type, int protocol);
函数
函数socket()的参数domain用于设置网络通讯的域,函数socket()根据这个参数选择通讯协议的族。通讯协议族在文件sys/socket.h中定义。spa
表1 domain的值及含义code
名称 | 含义 | 名称 | 含义 |
---|---|---|---|
PF_UNIX,PF_LOCAL | 本地通讯 | PF_X25 | ITU-T X25 / ISO-8208协议 |
AF_INET,PF_INET | IPv4 Internet协议 | PF_AX25 | Amateur radio AX.25 |
PF_INET6 | IPv6 Internet协议 | PF_ATMPVC | 原始ATM PVC访问 |
PF_IPX | IPX-Novell协议 | PF_APPLETALK | Appletalk |
PF_NETLINK | 内核用户界面设备 | PF_PACKET | 底层包访问 |
函数socket()的参数type用于设置套接字通讯的类型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(数据包套接字)等。进程
表2 type的值及含义内存
名称 | 含义 |
---|---|
SOCK_STREAM | Tcp链接,提供序列化的、可靠的、双向链接的字节流。支持带外数据传输 |
SOCK_DGRAM | 支持UDP链接(无链接状态的消息) |
SOCK_SEQPACKET | 序列化包,提供一个序列化的、可靠的、双向的基本链接的数据传输通道,数据长度定常。每次调用读系统调用时数据须要将所有数据读出 |
SOCK_RAW | RAW类型,提供原始网络协议访问 |
SOCK_RDM | 提供可靠的数据报文,不过可能数据会有乱序 |
SOCK_PACKET | 这是一个专用类型,不能呢过在通用程序中使用 |
并非全部的协议族都实现了这些协议类型,例如,AF_INET协议族就没有实现SOCK_SEQPACKET协议类型。资源
函数socket()的第3个参数protocol用于制定某个协议的特定类型,即type类型中的某个类型。一般某协议中只有一种特定类型,这样protocol参数仅能设置为0;可是有些协议有多种特定的类型,就须要设置这个参数来选择特定的类型。原型
函数socket()并不老是执行成功,有可能会出现错误,错误的产生有多种缘由,能够经过errno得到:
表3 errno的值及含义
值 | 含义 |
---|---|
EACCES | 没有权限创建制定的domain的type的socket |
EAFNOSUPPORT | 不支持所给的地址类型 |
EINVAL | 不支持此协议或者协议不可用 |
EMFILE | 进程文件表溢出 |
ENFILE | 已经达到系统容许打开的文件数量,打开文件过多 |
ENOBUFS/ENOMEM | 内存不足。socket只有到资源足够或者有进程释放内存 |
EPROTONOSUPPORT | 制定的协议type在domain中不存在 |
其余 |
创建一个流式套接字:
int sock = socket(AF_INET, SOCK_STREAM, 0);