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

问题描述 投票:0回答:2

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

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

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

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

谢谢。

linux network-programming
2个回答
9
投票

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

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

辅助数据用于从内核到用户空间应用程序接收与EXTRA数据包相关的服务/信息,否则这是不可用的。例如,假设机器 B 通过网络接收到一些数据包,并且您想知道数据包到达的入口接口?你怎么知道这个?辅助数据可以拯救您。

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

辅助数据是内核和用户空间应用程序之间或同一机器上的进程之间(对于 UNIX 套接字)进行通信的方式。这不是电线上的数据包所具有的东西。


4
投票

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

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

这三种情况只是通过

recvmsg(2)
从内核区接收控制信息的人工API方法。最后一个是最有趣的:辅助数据实际发送的唯一情况是使用 Unix 域套接字,其中一切都发生在内核中,因此实际上没有任何内容传输到网络上。

© www.soinside.com 2019 - 2024. All rights reserved.