sendmsg()中的辅助数据如何工作?

时间:2013-01-02 19:58:41

标签: linux network-programming

sendmsg()允许将辅助数据发送到另一个套接字,我想知道这是如何工作的。

1)辅助数据是否与正常消息一起打包?

2)如果是这样,远程接收套接字如何知道如何解析它?

3)远程接收客户端如何检索此辅助数据?

感谢。

2 个答案:

答案 0 :(得分:5)

辅助数据不会在线上发送 - 绝不会。对于Unix域套接字,辅助数据用于在进程之间发送或接收文件描述符以共享或负载平衡任务。注意:Unix域套接字在同一台机器上运行的进程之间传输信息,而不是在不同机器上运行的进程之间传递信息。

同样,如果进程在不同的机器上运行:当在发送机器(或接收机器)上应用辅助概念时,不使用任何辅助概念的数据包将与数据包完全相同。因此,辅助数据不是您的数据包附带的东西。

辅助数据用于从内核到用户空间应用程序接收 EXTRA 数据包相关服务/信息,否则无法使用。例如,假设机器B在线路上收到一些数据包,你想知道数据包到达的入口接口?你怎么知道的?辅助数据得到了拯救。

辅助数据是在辅助控制缓冲区中设置的一种标志,当调用sendmsg()/ recvmsg()时传递给内核,它告诉内核当数据包发送或到达时,将提供哪些额外的服务/信息应用程序调用调用。

辅助数据是指内核和用户空间应用程序之间的通信或UNIX套接字在同一台机器上的进程之间的通信。它不是线上数据包的东西。

供您参考,下载代码示例here,它在我的ubuntu机器上运行完美。辅助数据概念在src/igmp_pkt_reciever.c中得到证明。

答案 1 :(得分:2)

您只能通过以下几种方式使用辅助数据:

  • 您可以使用它来获取接收接口(IPv4)
  • 您可以使用它来指定跃点限制(对于IPv6)
  • 您可以使用它来指定流量类别(再次,IPv6)
  • ....
  • 您可以使用它来传递/接收文件描述符或用户凭据(Unix域)

这三种情况只是通过recvmsg(2)从内核接收控制信息的人工API方法。最后一个是最有趣的:辅助数据实际发送的唯一情况是使用Unix域套接字,其中所有内容都发生在内核中,因此实际上没有任何内容可以通过线路传输。