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

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

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

2)如果是这样,一个远程接收套接字如何知道如何parsing这个?

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

谢谢。

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

同样,如果进程运行在不同的机器上:当发送机器(或接收机器)应用辅助概念时,没有使用任何辅助概念的数据包与数据包完全相同。 因此,辅助数据不是随您的数据包一起提供的。

辅助数据用于接收从内核到用户空间应用程序的EXTRA数据包相关服务/信息,否则不可用。 例如,假设机器B在线路上接收到一些数据包,并想知道数据包从哪里来的入口接口? 你怎么知道这个? 辅助数据来救援。

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

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

下载代码示例,在我的ubuntu机器上完美运行,供大家参考。 辅助数据概念在src/igmp_pkt_reciever.c演示。

您只能以几种选择方式使用辅助数据:

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

这三种情况只是通过recvmsg(2)从核心土地接收控制信息的人工API方法。 最后一个是最有趣的:辅助数据实际发送的唯一情况是在Unix域套接字中,所有事情都发生在内核中,所以实际上没有任何东西在线上。