18.3.2 创建套接字
套接字是通过标准的UNIX文件描述符和其他的程序通信的一个方法。套接字在使用前必须先被建立,建立套接字的系统调用为socket(),它的一般形式是:
int socket(int domain, int type, int protocol);
创建出来的套接字是一条通信线路的一个端点,domain参数负责指定地址族,type参数负责指定与这个套接字一起使用的通信类型,而protocol参数负责制定所使用的协议。domain参数的取值范围如表18.2所示。
表18.2 domain参数的取值范围
参 数 |
说 明 |
AF_UNIX |
UNIX内部(文件系统套接字) |
AF_INET |
ARPA因特网协议(UNIX网络套接字) |
AF_ISO |
ISO标准协议 |
AF_NS |
施乐网络系统协议 |
AF_IPX |
NOVELL IPX协议 |
AF_APPLETALK |
Appletalk DDS |
最常用的套接字域是AF_UNIX和AF_INET,前者用于通过UNIX文件系统实现的本地套接字,后者用于UNIX网络套接字。AF_INET套接字可以用在穿过包括Internet在内的各种TCP/IP网络而进行通信的应用程序中。
套接字参数type指定了与新套接字对应的通信特性。它的取值范围为枚举常量SOCK_STREAM和SOCK_DGRAM。SOCK_STREAM是一个有序的、可靠的、基于连接的双向字节流。对于一个AF_INET域的套接字来说,如果在恋歌流式套接字的两端之间建立的是一个TCP连接,连接时默认值即为该特性。SOCK_DGRAM是一个数据图服务,可以用来发送最大长度是一个固定值的消息,但消息是否会被送达或者消息的先后次序是否会在网络传输中被重新安排并没有保证。对于AF_INET域的套接字来说,这种类型的通信是由UDP提供的。
通信所用的协议通常是由套接字的类型和套接字的域来决定,如果还有其他的协议可以选择,那么就在protocol参数里设置。protocol参数默认值为0,表示使用默认的协议。
socket系统调用返回的是一个描述符,它与文件描述符非常相似。当这个套接字和通信线路另一端的套接字连接好以后,就可以进行数据的传输和接收操作了。