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

wei*_*wei 5 linux network-programming

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

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

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

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

谢谢。

Abh*_*gar 6

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

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

辅助数据用于从内核到用户空间应用程序接收与EXTRA数据包相关的服务/信息,否则该信息将不可用。例如,假设机器B接收到一些有线数据包,而您想知道该数据包从何而来的入口接口?您怎么知道的?辅助数据可助您一臂之力。

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

辅助数据是内核和用户空间应用程序之间或在使用UNIX套接字的情况下在同一计算机上的进程之间进行通信的手段。这不是有线数据包所具有的。

供您参考,请在此处下载代码示例该示例可在我的ubuntu机器上完美运行。辅助数据概念在中进行了演示src/igmp_pkt_reciever.c


cni*_*tar 4

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

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

这三种情况只是通过recvmsg(2). 最后一个是最有趣的:实际发送辅助数据的唯一情况是使用 Unix 域套接字,其中所有事情都发生在内核中,因此实际上没有任何内容传输到网络上。