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

C实现UNIX域数据报Socket服务端对接Python客户端阻塞及报错问题

问题1:Python侧调用阻塞recvfrom导致两个进程同时阻塞的原因

核心原因按优先级从高到低排列如下:

  • C侧代码存在野指针隐患,直接导致发送目标地址错误
    你C侧的create_socket_server函数中,svaddr是函数栈上的局部变量,函数执行结束后栈空间会被系统回收,你将&svaddr赋值给retvals[1]返回的是野指针。如果后续C侧发送数据时用这个野指针指向的地址作为sendto的目标,根本不会发送到Python绑定的/tmp/py_sock路径,阻塞模式下sendto会因为目标socket不存在一直阻塞,Python自然收不到数据,两边就会同时卡在各自的阻塞调用上。
  • 父子进程启动时序不匹配
    你通过fork-execv启动Python子进程后,如果C父进程在Python完成csock.bind(csock_file)操作之前就调用了sendto发送数据,因为此时Python的socket还未创建绑定,UDS数据报的阻塞发送会直接卡住,等到Python完成绑定开始执行recvfrom时,C的发送还卡着,自然两边都阻塞。
  • 额外验证点:确认C侧sendto的目标地址确实是Python侧绑定的/tmp/py_sock路径,而不是之前纯C测试时用的其他路径,地址填写错误也会导致发送失败双方阻塞。

问题2:非阻塞模式下Resource temporarily unavailable报错的原因

这个是Unix系统非阻塞IO的标准行为:当你把socket设为非阻塞模式后,调用recvfrom时如果内核接收缓冲区中没有可读取的数据,系统不会阻塞等待数据到来,而是直接返回EAGAIN错误(对应错误码11),提示当前资源暂时不可用。这种报错不是异常,你需要搭配select/poll/epoll等IO多路复用接口监听socket的可读事件,只有当事件触发时再调用recvfrom读取数据,就不会出现这个报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:45:07