Прослушивание SIP на нескольких портах в одном приложении с помощью Qt и pjsip

Я пытаюсь прослушивать сообщения SIP на нескольких портах в моем приложении на основе Qt. Я просто создаю несколько объектов моего класса полномочие.

Пример примера proxy.cpp:

proxy* thisProxy;
proxy::proxy(quint16 port, QObject *parent) :
QObject(parent), portFromConfig(port)
{
thisProxy = this;
thread = new QThread(this);
connect(thread, SIGNAL(started()), this, SLOT(start()));
connect(thread, SIGNAL(finished()), this, SLOT(deleteLater()));
this->moveToThread(thread);
thread->start();
}

void proxy::start()
{
pj_status_t status;
pj_caching_pool caching_pool;
pj_sockaddr_in sockaddr;
pj_str_t ourAddressFromConfig;

pj_thread_desc initdec;
pj_thread_t* thread = 0;

if (!pj_thread_is_registered() && pj_thread_register("PJ_THREAD", initdec, &thread ) != PJ_SUCCESS)
return;

pjsip_module proxy = {
NULL,
NULL,
pj_str("proxy"),
-1,
PJSIP_MOD_PRIORITY_UA_PROXY_LAYER,
NULL,
NULL,
NULL,
NULL,
&onReceivedRequest,
&onReceivedResponse,
NULL,
NULL,
NULL
};

pj_log_set_level(4);

//initialize pj
status = pj_init();
if (status != PJ_SUCCESS)
{
qDebug() << "pj_init failed";
return;
}

//initilaize pjlib_util
status = pjlib_util_init();
if (status != PJ_SUCCESS)
{
qDebug() << "pjlib_util_init failed";
return;
}

//initialize caching pool
pj_caching_pool_init(&caching_pool, &pj_pool_factory_default_policy, 0);

//create the endpoint
status = pjsip_endpt_create(&caching_pool.factory, NULL, &endpoint);
if (status != PJ_SUCCESS)
{
qDebug() << "pjsip_endpt_create failed";
return;
}

//specify our socket
ourAddressFromConfig = pj_str(addressFromConfig.toLatin1().data());
sockaddr.sin_family = pj_AF_INET();

if (ourAddressFromConfig.slen)
pj_inet_aton(&ourAddressFromConfig, &sockaddr.sin_addr);
else
sockaddr.sin_addr.s_addr = 0;

sockaddr.sin_port = pj_htons((pj_uint16_t) portFromConfig);

//start the socket
status = pjsip_udp_transport_start(endpoint, &sockaddr, NULL, 1, &transport);
if (status != PJ_SUCCESS)
{
qDebug() << "pjsip_udp_transport_start failed";
return;
}

//create the caching pool
poolt = pj_pool_create(&caching_pool.factory, "UDPproxy", 4000, 4000, NULL);

//register the proxy module
status = pjsip_endpt_register_module(endpoint, &proxy);
if (status != PJ_SUCCESS)
{
qDebug() << "pjsip_endpt_register_module failed";
return;
}

pj_time_val delay = {0, 10};

while(true)
{
pjsip_endpt_handle_events(endpoint, &delay);
}

qDebug() << "finished";
}

Самое интересное, что когда я создаю первые два экземпляра полномочие это работает, но когда я создаю третий экземпляр, мое приложение завершается с этой ошибкой:

server: ../src/pjsip/sip_tel_uri.c:173: pjsip_tel_uri_subsys_init: Assertion `status==0' failed.
Aborted (core dumped)

Обратный след от сброшенного ядра:

(gdb) bt
#0  0xb777d424 in __kernel_vsyscall ()
#1  0xb6e881df in raise () from /lib/i386-linux-gnu/libc.so.6
#2  0xb6e8b825 in abort () from /lib/i386-linux-gnu/libc.so.6
#3  0xb6e81085 in ?? () from /lib/i386-linux-gnu/libc.so.6
#4  0xb6e81137 in __assert_fail () from /lib/i386-linux-gnu/libc.so.6
#5  0x08079344 in pjsip_tel_uri_subsys_init ()
#6  0x08069265 in pjsip_endpt_create ()
#7  0x080569a7 in proxy::start (this=0x8905db8) at ../server/proxy.cpp:93
#8  0x0805f0c1 in proxy::qt_static_metacall (_o=0x8905db8, _c=QMetaObject::InvokeMetaMethod, _id=1, _a=0xb3aff270) at moc_proxy.cpp:75
#9  0xb73d4c5d in QMetaObject::activate(QObject*, int, int, void**) () from /home/dev/Qt/5.1.1/gcc/lib/libQt5Core.so.5
#10 0xb73d567b in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) () from /home/dev/Qt/5.1.1/gcc/lib/libQt5Core.so.5
#11 0xb7444ef5 in QThread::started(QThread::QPrivateSignal) () from /home/dev/Qt/5.1.1/gcc/lib/libQt5Core.so.5
#12 0xb71d7388 in ?? () from /home/dev/Qt/5.1.1/gcc/lib/libQt5Core.so.5
#13 0xb713ad4c in start_thread () from /lib/i386-linux-gnu/libpthread.so.0
#14 0xb6f49bae in clone () from /lib/i386-linux-gnu/libc.so.6

Я не знаю, что я делаю не так. Кто-нибудь может помочь, пожалуйста?

Заранее благодарю за любую помощь.

1

Решение

Основная проблема заключается в том, что вы создаете новую конечную точку SIP на каждом proxy экземпляр и, хотя в текущей документации утверждается, что «теоретически» поддерживается множественный экземпляр конечной точки SIP, на самом деле это не так.

Точнее, при первом звонке pjsip_endpt_create три статических парсера URI зарегистрированы (для sip:, sips: а также tel:), второй раз tel: снова зарегистрирован (есть проверка, чтобы избежать sip: а также sips: но не для tel:) и при попытке зарегистрироваться tel: опять же, в третий раз, максимальное количество парсеров URI (4) превышено, регистрация не удалась и дампы подтверждений.

Я предлагаю вам работать только с одной конечной точкой SIP, создавая новый сокет UDP для каждого proxy экземпляр и присоединение его к конечной точке с помощью pjsip_udp_transport_attach2

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]