【问题标题】:c sockets sendmsg MSG_DONTWAIT - buffer reusec sockets sendmsg MSG_DONTWAIT - 缓冲区重用
【发布时间】:2020-12-30 18:32:05
【问题描述】:

我正在使用 C 套接字发送设置了 MSG_DONTWAIT 标志的 ICMP 数据包。 我的程序是单线程的,但它希望以高频率发送消息,所以我将消息发送设置为非阻塞。 每次调用后共享/修改/重用消息缓冲区是否安全? (除非返回 EAGAIN 或 EWOULDBLOCK)。

msg_control(辅助数据)被重用,msg_control->struct in_pktinfo->ipi_ifindex(出站接口ifindex)在调用之间被修改。

iov.iov_base 缓冲区内容(不是指针!)和 iov.iov_len 也可以在调用之间更改。 (不太可能,但仍有可能)。

是否可以在非阻塞模式下高频更改calsl之间的ifinex和iov_base内容? (除非我回来 EAGAIN 或 EWOULDBLOCK)

谢谢!

【问题讨论】:

    标签: c linux sockets sendmsg


    【解决方案1】:

    是的,它是安全的。在 Linux 上,在send 返回之前,您指定的所有数据都会立即复制到内核中的缓冲区中。如果内核的缓冲区已满,它会返回 EAGAIN 或 EWOULDBLOCK(这在 Linux 中显然是一样的)并且什么也没有发生。您不必担心内核会在您更改缓冲区中的数据后稍后发送数据包。

    在 Windows 上,非阻塞“重叠”操作记住 你的缓冲区并在以后使用它 - 所以如果你曾经做过非阻塞 I/ O 在 Windows 上。 (你会知道的,因为它与阻塞 I/O 完全不同)

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2019-12-18
      • 2015-05-01
      • 2014-03-16
      • 2012-08-14
      • 2018-03-11
      相关资源
      最近更新 更多