网络IPC:套接字 -- (1)套接字描述符
1. 套接字描述符
套接字时通信端点的抽象。正如使用文件描述符访问文件,应用程序用套接字描述符访问套接字。套接字描述符在UNIX系统中被当作一种文件描述符。
为创建一个套接字,使用socket函数。
1 #include <sys/socket.h> 2 int socket (int domain, int type, int protocol); 3 4 返回值:若成功,返回文件(套接字)描述符;若出错,返回-1
参数domain(域)确定通信的特性,包括地址格式。各个域都有自己表示地址的格式,而表示各个域的常数都以AF_开头,意指地址族(address family)。
| 域 | 描述 |
| AF_INET | IPv4因特网域 |
| AF_INET6 | IPv6因特网域 |
| AF_UNIX | UNIX域 |
| AF_UNSPEC | 未指定 |
参数type确定了套接字的类型,进一步确定通信特性。
| 类型 | 描述 |
| SOCK_DGRAM | 固定长度、无连接的、不可靠的报文传递 |
| SOCK_RAW | IP协议的数据报接口 |
| SOCK_SEQPACKET | 固定长度的、有序的、可靠的、面向连接的报文传递 |
| SOCK_STREAM | 有序的、可靠的、双向的、面向连接的字节流 |
参数protocal通常是0,表示为给定的域和套接字类型选择默认协议。当对同一域和套接字类型支持多个协议时,可以使用protocol选择一个特定的协议。在AF_INET通信域中,套接字类型SOCK_STREAM的默认协议是TCP,在套接字类型SOCK_DGRAM的默认协议是UDP。
| 协议 | 描述 |
| IPPROTO_IP | IPv4网际协议 |
| IPPROTO_IPV6 | IPv6网际协议 |
| IPPROTO_ICMP | 因特网控制报文协议 |
| IPPROTO_RAW | 原始IP数据包协议 |
| IPPROTO_TCP | 传输控制协议 |
| IPPROTO_TCP | 网络用户报文协议 |
对于数据报(SOCK_DGRAM)接口,两个对等进程之间通信时不需要逻辑连接。只需要向对等进程所使用的套接字送出一个报文。因此数据包提供了一个无连接的服务。
另一方面,字节流(SOCK_STREAM)要求在交换数据之前,在本地的套接字和通信的对等进程的套接字之间建立一个逻辑连接。数据报就像发邮件,不需要连接。字节流就像打电话,需要先建立连接。
SOCK_SEQPACKET套接字和SOCK_STREAM套接字类似,只是从该套接字得到的是基于报文的服务而不是字节流服务。这意味着从SOCK_SEQPACKET套接字接收的数据量与对方所发送的一致。流控制传输协议(SCTP)提供了因特网域上的顺序数据包服务。
SOCK_RAW套接字提供一个数据报接口,用于直接访问下面的网络层(即因特网中的IP层)。使用这个接口时,应用程序负责构造自己的协议头部,这是因为传输协议(如TCP和UDP)被绕过了,当创建一个原始套接字时,需要有admin权限,这样可以防止恶意程序绕过内建安全机制来创建报文。
套接字通信是双向的。可以采用shutdown函数来禁止一个套接字的I/O。
1 #include <sys/socket.h> 2 int shutdown (int sockfd, int how); 3 4 返回值:若成功,返回0;若出错,返回-1
how参数,SHUT_RD(关闭读端),SHUT_WR(关闭写端),SHUT_RDWR(读写关闭)

浙公网安备 33010602011771号