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

使用pyVoIP库出现Bad file descriptor错误的技术求助

问题解决:pyVoIP Bad file descriptor 错误修复

问题分析

你的代码存在两个核心问题触发该错误:

  1. 全局变量作用域错误:answer函数中修改的是局部变量anum,全局的anum始终为空,后续回拨操作会触发异常,进而导致SIP socket资源异常。
  2. 资源释放时序问题:未确保回拨操作完成就直接调用vp.stop(),导致SIP接收线程还在运行时socket被关闭,触发Bad file descriptor错误。

修复后的代码

from pyVoIP.VoIP import VoIPPhone, CallState, InvalidStateError
import time

anum = ''

def answer(call): 
    global anum  # 声明使用全局变量,确保修改的是外部定义的anum
    try:
        print(call.state)
        # 安全获取主叫号码,避免键不存在引发异常
        if "From" in call.request.headers and "number" in call.request.headers["From"]:
            anum = call.request.headers["From"]["number"]
            print(f"获取到主叫号码: {anum}")
        # 无需接听后挂断,直接拒绝来电即可,减少状态切换带来的资源问题
        call.hangup()
    except InvalidStateError:
        pass
    except Exception as e:
        print(f"处理来电时出错: {e}")

if __name__ == "__main__":
    vp = VoIPPhone('79.98.45.133', 5060, '0662279775', '065+eMl6Ttd6$T', callCallback=answer)
    vp.start()
    print(f"电话状态: {vp._status}")
    print(f"呼叫状态枚举: {CallState}")
    
    input("Press enter to call back and disable the phone")
    
    if anum:  # 确保有有效主叫号码才执行回拨
        try:
            print(f"正在回拨: {anum}")
            call = vp.call(anum)
            # 等待回拨流程执行(可根据实际需求调整等待时长或监听呼叫状态)
            time.sleep(5)
            call.hangup()
        except Exception as e:
            print(f"回拨失败: {e}")
    else:
        print("未获取到有效主叫号码,跳过回拨")
    
    # 确保回拨操作完成后再停止服务
    vp.stop()

关键修复点

  • 全局变量声明:在answer函数中添加global anum,解决局部变量覆盖全局变量的问题,确保主叫号码能被正确记录。
  • 安全取值校验:增加headers键存在性检查,避免因SIP头结构异常触发未捕获的异常。
  • 优化来电处理逻辑:直接拒绝来电而非接听后挂断,减少不必要的呼叫状态切换,降低资源异常概率。
  • 回拨前置校验:回拨前检查anum有效性,避免空号码调用引发的socket异常。
  • 调整资源释放时序:回拨完成后再调用vp.stop(),确保SIP线程操作的socket资源处于有效状态。

额外建议

  • 更新pyVoIP到最新稳定版:pip install --upgrade pyVoIP
  • 避免直接访问vp._status这类私有属性,优先使用官方提供的公开API获取状态
  • 增加更多异常捕获逻辑,提升程序在复杂网络环境下的稳定性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:25:00