You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

信号中断数据报套接字sendto/recvfrom调用的行为咨询

信号中断数据报套接字sendto/recvfrom的行为

sendto 调用的表现

  • UDP是面向消息的协议,sendto对数据报套接字的操作具有原子性:要么完整发送整个数据报(返回数据报的字节数),要么完全未发送。
  • 若信号在sendto未开始写入网络缓冲区前触发,调用会返回-1,同时errno被设为EINTR。
  • 一旦内核已将数据报成功写入网络缓冲区,哪怕后续触发信号,sendto仍会返回成功的字节数,不会被中断返回错误。

recvfrom 调用的表现

  • 同理,recvfrom对数据报套接字的读取也是原子性的:要么完整接收一个数据报(返回数据报长度),要么未接收到任何有效数据。
  • 若信号在recvfrom未接收到完整数据报时触发,调用返回-1,errno设为EINTR。
  • 只要内核已接收到完整数据报并准备好拷贝到用户缓冲区,即便此时收到信号,recvfrom也会返回数据报的字节数,不会因信号中断返回错误。

结论

  • 数据报套接字的sendto和recvfrom不会出现返回部分字节数的情况:要么返回完整的消息长度(操作成功),要么返回-1且errno=EINTR(被信号中断且未完成任何操作)。
  • 你无需处理“部分发送/接收后重复调用”的场景,只需根据返回值判断:若为-1且errno=EINTR,可选择重新发起调用;否则按成功或其他错误逻辑处理。

内容的提问来源于stack exchange,提问作者Michal Butterweck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:45:33