【问题标题】:Why should I use, or not use, MSG_CONFIRM?为什么我应该使用或不使用 MSG_CONFIRM?
【发布时间】:2013-05-16 18:01:58
【问题描述】:

我熟悉 BSD 套接字,翻阅 sendto 的手册页,我碰到了 MSG_CONFIRM 标志,这对我来说现在很神秘。

描述说:

告诉链接层发生了前向进展:你得到了一个 对方回复成功。如果链路层没有得到 这将定期重新探测邻居(例如,通过单播 ARP)。 仅在 SOCK_DGRAM 和 SOCK_RAW 套接字上有效,目前 仅适用于 IPv4 和 IPv6。

快速浏览 arp 的手册页后,我了解到标记 MSG_CONFIRM 可以防止 ARP 映射 MAC 地址 ↔ 远程机器的 IP 地址被认为是陈旧的。

现在我很困惑,因为我看不出有什么理由我应该把它写出来,因此,他们为什么不直接在图书馆里强制执行。为什么应用层要处理链接层发生的任何事情。

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

【问题讨论】:

    标签: c sockets arp


    【解决方案1】:

    只有当您发送的数据报是对您刚刚从同一对等方收到的数据报的直接响应时,您才应该设置该标志。

    如果您发送初始请求,或发送数据报以响应其他事件(如用户输入或超时),那么您应该设置MSG_CONFIRM 标志。

    【讨论】:

    • 如果不是 MSG_CONFIRM,初始请求的默认值应该是多少?
    • @bakalolo:如果您在调用sendto() 时没有设置标志,您只需将0 作为flags 参数传递。
    • 如果有这个答案中信息的来源参考会很高兴。
    【解决方案2】:

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

    似乎发送它的情况需要一个非常特殊的情况,在这种情况下你可以保证你的消息接收者的事情。周期性 ARP 请求的开销非常低,因此收益非常有限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 2010-12-22
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      相关资源
      最近更新 更多