23-sendmsg()和recvmsg()系统调用
61.13.2 sendmsg()和recvmsg()系统调用
sendmsg()和recvmsg()是套接字 I/O 系统调用中最为通用的两种。sendmsg()系统调用能做到所有write()、send()以及sendto()能做到的事;recvmsg()系统调用能做到所有read()、recv()以及recvfrom()能做到的事。此外,这两个系统调用还有如下功能。
- 同readv()和writev()(见5.7节)一样,我们可以执行分散-聚合I/O(scatter-gather I/O)。当我们通过sendmsg()在数据报套接字上聚合输出时(或者在一个已连接的数据报套接字上执行writev()),就生成一个单独的数据报。相反,recvmsg()(以及readv())可用来在数据报套接字上分散输入,将单个数据报分散到多个用户空间缓冲区中。
- 我们可以传送包含特定于域的辅助数据(也称为控制信息)。辅助数据可以通过流式和数据报式套接字来传递。我们会在下面介绍一些有关辅助数据的例子。
Linux 2.6.33版新增了一个系统调用recvmmsg()。该系统调用类似于recvmsg(),但允许在单个系统调用中接收多个数据报。当应用程序需要处理的网络流量很高时,这可以减小应用程序中的系统调用开销。在未来的内核版本中很有可能会增加一个类似于sendmmsg()这样的系统调用。