C++ 关闭pjsip应用程序的正确方法是什么?

C++ 关闭pjsip应用程序的正确方法是什么?,c++,sip,pjsip,C++,Sip,Pjsip,我基于pjsip(pjsua2)编写了简单的应用程序。 如果在有活动调用时关闭应用程序,则在Endpoint::on_call_状态中存在内存访问错误(pjsua_call_id call_id,pjsip_事件*e) 我在关门前试一下 Endpoint::instance().hangupAllCalls(); pj_thread_sleep(2000); 一些时间2秒足够关闭和应用程序正确关闭的时间,但一些时间不能 关闭pjsua2应用程序的正确方法是什么? 如何等待所有调用都挂断?从我使

我基于pjsip(pjsua2)编写了简单的应用程序。 如果在有活动调用时关闭应用程序,则在Endpoint::on_call_状态中存在内存访问错误(pjsua_call_id call_id,pjsip_事件*e)

我在关门前试一下

Endpoint::instance().hangupAllCalls();
pj_thread_sleep(2000);
一些时间2秒足够关闭和应用程序正确关闭的时间,但一些时间不能

关闭pjsua2应用程序的正确方法是什么?
如何等待所有调用都挂断?

从我使用PJSUA2的经验来看,正确的退出方法是确保在pj::Account析构函数之前调用所有调用的析构函数,在pj::Endpoint析构函数之前调用pj::Account的destructor

在我的应用程序中,pj::Account派生类中有整数调用计数器和exit bool标志,如:

class MyAccount : public pj::Account
{
public:
    ...
    void incrementCallsCount() { ++_callsCount; }
    void decrementCallsCount() { --_callsCount; }
    size_t getCallsCount() const { return _callsCount; }
    ...
    void setWantExit(boot wantExitFlag) { _wantExitFlag = wantExitFlag; }
    void onIncomingCall(pj::OnIncomingCallParam &prm)
    {
       if (_wantExitFlag)
           return;
       MyCall *call = MyCall::create(*this, prm.callId);
       // Do your stuff with call:
       // - add to map id->call
       // - answer SIP 180 Ringing / SIP 200 OK
    }
    ...
private:
    std::atomic<size_t> _callsCount;
    bool _wantExitFlag;
};
请注意,构造函数和析构函数声明为private,以确保用户仅通过静态函数MyCall::create()创建调用!MyCall类负责内存管理:仅当PJSUA2通知删除调用时才删除调用(
PJSIP\u INV\u STATE\u DISCONNECTED
call STATE)

考虑到这些函数和类,如果您只想立即退出应用程序,您应该:

  • 通过
    \u MyAccount.setWantExit(true)
    停止在MyAccount中创建MyCall。当
    pj::Call::onIncomingCall()
    函数立即返回时,PJSUA2通过立即为调用执行hangup()来处理此问题

  • 调用
    Endpoint::instance().hangupAllCalls()

  • 等待
    MyAccount::GetCallScont()
    将返回0

  • 确保在Enpoint的析构函数之前调用MyAccount的析构函数

  • 退出应用程序


非常感谢您的回答,我接受您的原则,并尝试返回此项目。实际上,我只是停止在我的应用程序中接收传入呼叫,而是使用
SIP 302进行应答,暂时移动到其他SIP电话实例(我已进行了分布式安装)。但这并不是我回答的重点。祝你好运
class MyCall : public pj::Call
{
public:
    typedef pj::Call base_class;
    static MyCall *create(MyAccount &account, int callId)
    {
        return new MyCall(account, callId);
    }

    virtual void onCallState(pj::OnCallStateParam& prm)
    {
        pj::CallInfo ci = getInfo();
        if (ci.state == PJSIP_INV_STATE_DISCONNECTED)
        {
            // You may call some onDisconnected() handler function here
            delete this;
            return;
        }
    }
    ...
private:
    MyCall(MyAccount &account, int callId)
        : base_class(account, callId)
        , _myAccount(account)
    {
        _myAccount.incrementCallsCount();
    }

    virtual ~MyCall()
    {
        _myAccount.decrementCallsCount();
    }

    MyAccount &_myAccount;
};