c sockets sendmsg MSG_DONTWAIT - 缓冲区重用

问题描述

我使用 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)

谢谢!

解决方法

是的,这是安全的。在 Linux 上,您指定的所有数据都会在 library(ggplot2) ggplot(mtcars,aes(hp,mpg)) + geom_point() + scale_x_continuous(sec.axis = dup_axis(name = NULL,labels = NULL)) + scale_y_continuous(sec.axis = dup_axis(name = NULL,labels = NULL)) 返回之前立即复制到内核中的缓冲区中。如果内核的缓冲区已满,它会返回 EAGAIN 或 EWOULDBLOCK(这在 Linux 中显然是相同的)并且没有任何反应。您不必担心内核会在您更改缓冲区中的数据后稍后发送数据包。

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