c sockets sendmsg MSG_DONTWAIT - 缓冲区重用

c sockets sendmsg MSG_DONTWAIT - buffer reuse

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

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

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

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

谢谢!

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

在 Windows 上,非阻塞“重叠”操作 执行 记住你的 缓冲区并稍后使用它 - 所以请注意如果你曾经在 Windows 上执行非阻塞 I/O,那么就可以解决这个问题。 (你会知道你是否这样做,因为它与阻止完全不同I/O)