首页 > 解决方案 > 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)

谢谢 !

标签: clinuxsocketssendmsg

解决方案


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

在 Windows 上,非阻塞“重叠”操作确实会记住您的缓冲区并在以后使用它——因此,如果您曾经在 Windows 上进行非阻塞 I/O,请注意这一点。(你会知道,因为它与阻塞 I/O 完全不同)


推荐阅读