26-顺序数据包套接字
61.13.5 顺序数据包套接字
顺序数据包套接字(Sequenced-packet sockets)结合了流式套接字和数据报套接字的功能。
- 同流式套接字一样,顺序数据包套接字也是面向连接的。建立连接的方式和流式套接字一样,也是通过bind()、listen()、accept()和connect()调用。
- 同数据报套接字一样,顺序数据包套接字也是保留消息边界的。在顺序数据包套接字上调用read()只会返回一条消息(由对端写入)。如果消息比调用者提供的缓冲区还要长,那么剩余的字节会被丢弃。
- 与流式套接字一样,而不同于数据报套接字的是:顺序数据包套接字之间的通信是可靠的。消息会以无错误、按顺序、不重复的方式传递到对端应用程序上,且可以保证消息会到达对端(假设没有出现系统或应用程序崩溃或者网络过载的现象)。
顺序数据包套接字也是通过socket()调用来创建的,需要将参数type指定为 SOCK_SEQPACKET。
在历史上,Linux同大多数UNIX实现一样,并没有在UNIX域或是Internet域提供对顺序数据包套接字的支持。但是,从2.6.4版内核开始,Linux在UNIX域套接字上支持了SOCK_SEQPACKET。
在Internet域上,UDP和TCP协议都不支持SOCK_SEQPACKET,但SCTP协议(将在下一节介绍)是支持的。
本书中我们没有给出一个使用顺序数据包套接字的例子。但是,除了会预留消息边界外,在使用上它同流式套接字并没有什么不同。