C++ 关闭pjsip应用程序的正确方法是什么?
我基于pjsip(pjsua2)编写了简单的应用程序。 如果在有活动调用时关闭应用程序,则在Endpoint::on_call_状态中存在内存访问错误(pjsua_call_id call_id,pjsip_事件*e) 我在关门前试一下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应用程序的正确方法是什么? 如何等待所有调用都挂断?从我使
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)
考虑到这些函数和类,如果您只想立即退出应用程序,您应该:
- 通过
停止在MyAccount中创建MyCall。当\u MyAccount.setWantExit(true)
函数立即返回时,PJSUA2通过立即为调用执行hangup()来处理此问题pj::Call::onIncomingCall()
- 调用
Endpoint::instance().hangupAllCalls()
- 等待
将返回0MyAccount::GetCallScont()
- 确保在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;
};