我为什么要使用或不使用MSG_CONFIRM?

qdi*_*dii 4 c sockets arp

我熟悉BSD插座,翻阅手册sendto,我碰到了MSG_CONFIRM旗帜,这对我来说是非常神秘的.

描述说:

告诉链接层转发进度:您从另一方获得了成功的回复.如果链路层没有得到这个,它将定期重新修复邻居(例如,通过单播ARP).仅在SOCK_DGRAM和SOCK_RAW套接字上有效,目前仅针对IPv4和IPv6实现.

在快速查看手册之后arp,我明白标记某些东西MSG_CONFIRM可以防止ARP映射MAC地址remote远程机器的IP地址被认为是陈旧的.

现在我很奇怪,因为我看不出有任何理由,我应该不会把它,因此,他们为什么不执行直接在库中.为什么应用层应该处理在链路层发生的任何事情.

所以我错过了什么?我什么时候应该设置它,还是不设置它?

caf*_*caf 6

如果您发送的数据报是对刚刚从同一对等方收到的数据报的直接响应,则只应设置该标志.

如果你发送的初始请求,或者响应其他一些事件(如用户输入,或超时)发送一个数据包,那么你应该设置MSG_CONFIRM标志.

  • @bakalolo:如果在调用“sendto()”时没有要设置的标志,则只需将 0 作为“flags”参数传递即可。 (2认同)

xax*_*xon 4

不发送它的原因是为了防止 IP 的 MAC 地址随着时间的推移而发生变化。如果您不断告诉系统不要检查,即使 IP 地址不再存在,它也会继续发送到同一个 MAC。

看来发送它需要一种非常特殊的情况,在这种情况下您可以保证有关消息收件人的信息。定期 ARP 请求的开销非常低,因此带来的好处极其有限。