c - 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)
谢谢 !
解决方案
是的,它是安全的。send
在 Linux 上,您指定的所有数据都会在返回之前立即复制到内核中的缓冲区中。如果内核的缓冲区已满,它会返回 EAGAIN 或 EWOULDBLOCK(这在 Linux 中显然是一样的)并且什么也没有发生。您不必担心内核会在您更改缓冲区中的数据后发送数据包。
在 Windows 上,非阻塞“重叠”操作确实会记住您的缓冲区并在以后使用它——因此,如果您曾经在 Windows 上进行非阻塞 I/O,请注意这一点。(你会知道,因为它与阻塞 I/O 完全不同)
推荐阅读
- python - 如何查询币安保证金账户的唯一符号余额?
- graphql - 在 Apollo graphql 服务器中配置 @Directive
- r - 是否可以根据行范围和 r 中的逻辑条件对 data.frame 进行子集化?
- google-analytics - Google Analytics(分析)用户 ID 报告维度和指标
- php - 404 未找到带有路由参数的 Laravel
- java - 未生成倾城报告
- spring-boot - 使用带有路径变量的 Consul 进行服务发现
- php - 在 Laravel 中的请求对象上使用 '->only' 时如何使用 'hasFile & 'file' 或等价物
- windows-installer - Windows 安装程序弹出修复机制
- python - 留一法交叉验证 [fbprophet]