#184 closed баг (fixed)
Программа не регистрируется на SIP-сервере по IPv6
Reported by: | alx | Owned by: | dimag |
---|---|---|---|
Priority: | trivial | Milestone: | 2 очередь |
Component: | ПО MC04-Dispatcher. Пульт диспетчера/техника | Keywords: | IPv6, network |
Cc: | san |
Description
При входе в систему по IPv6 возникает ошибка при попытке регистрации на SIP-сервере:
Failed to resolve 'voip6.kolez.com'
.
Более подробный лог такой:
17:28:22.685 pa_dev.c ..PortAudio sound library initialized, status=0 17:28:22.685 pa_dev.c ..PortAudio host api count=2 17:28:22.685 pa_dev.c ..Sound device count=0 17:28:22.685 pjlib ..select() I/O Queue created (0xed59c8) 17:28:22.693 sip_endpoint.c .Module "mod-evsub" registered 17:28:22.693 sip_endpoint.c .Module "mod-presence" registered 17:28:22.693 sip_endpoint.c .Module "mod-mwi" registered 17:28:22.693 sip_endpoint.c .Module "mod-refer" registered 17:28:22.693 sip_endpoint.c .Module "mod-pjsua-pres" registered 17:28:22.693 sip_endpoint.c .Module "mod-pjsua-im" registered 17:28:22.693 sip_endpoint.c .Module "mod-pjsua-options" registered 17:28:22.693 pjsua_core.c .1 SIP worker threads created 17:28:22.693 pjsua_core.c .pjsua version 2.1 for Linux-4.4.0.22/x86_64/glibc-2.17 initialized 17:28:22.693 pjsua_core.c .PJSUA state changed: CREATED --> INIT 17:28:22.693 pjsua_core.c bind() error: Адрес уже используется [status=120098] 17:28:22.694 pjsua_core.c SIP UDP socket reachable at 192.168.0.63:5061 17:28:22.694 udp0xef1470 SIP UDP transport started, published address is 192.168.0.63:5061 17:28:22.694 pjsua_core.c PJSUA state changed: INIT --> STARTING 17:28:22.694 sip_endpoint.c .Module "mod-unsolicited-mwi" registered 17:28:22.694 pjsua_core.c .PJSUA state changed: STARTING --> RUNNING 17:28:22.694 pjsua_acc.c Adding account: id=sip:2@voip6.kolez.com 17:28:22.694 pjsua_acc.c .Account sip:2@voip6.kolez.com added with id 0 17:28:22.694 pjsua_acc.c .Acc 0: setting registration.. 17:28:22.701 sip_resolve.c ...Failed to resolve 'voip6.kolez.com'. Err=70018 (gethostbyname() has returned error (PJ_ERESOLVE)) 17:28:22.701 tsx0xef8598 ...Failed to send Request msg REGISTER/cseq=63038 (tdta0xef6530)! err=70018 (gethostbyname() has returned error (PJ_ERESOLVE)) 17:28:22.701 pjsua_acc.c .....SIP registration failed, status=502 (gethostbyname() has returned error (PJ_ERESOLVE)) 17:28:22.701 pjsua_acc.c .....Scheduling re-registration retry for acc 0 in 1 seconds.. 17:28:22.701 sip_reg.c ..Error sending request, status=70018 17:28:22.701 pjsua_acc.c ..Unable to create/send REGISTER: gethostbyname() has returned error (PJ_ERESOLVE) [status=70018] Startup dlg finished ESL Connected Window Icon setted MainAppFrameWindow2 ctor pLogViewWidget created pSplitterSoundPlay created Main Window created 17:28:24.044 pjsua_acc.c Acc 0: setting registration.. 17:28:24.051 sip_resolve.c ..Failed to resolve 'voip6.kolez.com'. Err=70018 (gethostbyname() has returned error (PJ_ERESOLVE)) 17:28:24.051 tsx0x7f39e8003 ..Failed to send Request msg REGISTER/cseq=39256 (tdta0x7f39e8001d80)! err=70018 (gethostbyname() has returned error (PJ_ERESOLVE)) 17:28:24.051 pjsua_acc.c ....SIP registration failed, status=502 (gethostbyname() has returned error (PJ_ERESOLVE)) 17:28:24.051 pjsua_acc.c ....Scheduling re-registration retry for acc 0 in 303 seconds.. 17:28:24.051 sip_reg.c .Error sending request, status=70018 17:28:24.051 pjsua_acc.c .Unable to create/send REGISTER: gethostbyname() has returned error (PJ_ERESOLVE) [status=70018] 17:28:24.051 pjsua_acc.c Scheduling re-registration retry for acc 0 in 295 seconds..
Change History (21)
comment:1 by , 8 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
comment:2 by , 8 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
Проблема по-прежнему присутствует. Регистрация на сервере не удалась, диагностика та же.
Сообщение "Не удалось инициализировать подсистему SIP" не вывелось.
Тикет переоткрыт.
Когда закрываете тикет с резолюцией fixed, указывайте, пожалуйста, в комментарии номер ревизии, в которой внесено исправление. Можно в комментарии к коммиту написать "Closes #xxx" или "Fixes #xxx", тогда svn автоматически закроет тикет xxx со ссылкой на коммит в комментарии.
follow-up: 4 comment:3 by , 8 years ago
Как протестировать данную ошибку, у меня только IPv4 соединение.
comment:4 by , 8 years ago
Replying to dimag:
Как протестировать данную ошибку,
При подключении в качестве домена указать "voip6.kolez.com" - это имя резолвится в IPv6 адрес нашего коммутатора.
у меня только IPv4 соединение.
Не понял, что значит "только IPv4 соединение". Вот я указываю домен "voip6.kolez.com", и программа прекрасно соединяется с базой mysql по IPv6, затем также без проблем подключается к event-сокету коммутатора, а вот при регистрации на сервере - облом, почему-то говорит "Failed to resolve 'voip6.kolez.com'". Вот и надо выяснить, почему она (а точнее, PJSIP) не может отрезолвить это имя. Я предполагаю, что она запрашивает только A запись (которой у voip6.kolez.com нет), а AAAA - не запрашивает. Короче говоря, надо бы разобраться с проблемой и исправить...
follow-up: 7 comment:5 by , 8 years ago
PJSIP использует функцию gethostbyname() из библиотеки Winsock.
В соответствие с MSDN
"If the host specified in the name parameter has both IPv4 and IPv6 addresses, only the IPv4 addresses will be returned.
--The gethostbyname function can only return IPv4 addresses for the name parameter.-- The getaddrinfo function and associated addrinfo structure should be used if IPv6 addresses for the host are required or if both IPv4 and IPv6 addresses for the host are required."
То есть PJSIP не может работать с IPv6 адресами.
Аналогично я не могу достучаться до voip6.kolez.com через ping, который судя по всему тоже использует gethostbyname.
follow-up: 8 comment:6 by , 8 years ago
На данный момент поддержка одновременной работы с IPv4, IPv6 в PJSIP на стадии тестирования и не стабильна.
comment:7 by , 8 years ago
Replying to dimag:
PJSIP использует функцию gethostbyname() из библиотеки Winsock.
Хм... По-моему это не совсем так:
PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename, unsigned *count, pj_addrinfo ai[]) { #if defined(PJ_SOCK_HAS_GETADDRINFO) && PJ_SOCK_HAS_GETADDRINFO!=0 ...... rc = getaddrinfo(nodecopy, NULL, &hint, &res); ...... #else /* PJ_SOCK_HAS_GETADDRINFO */ ...... status = pj_gethostbyname(nodename, &he); ...... #endif /* PJ_SOCK_HAS_GETADDRINFO */
То есть gethostbyname()
используется лишь как fallback для систем, в которых getaddrinfo()
почему-то отсутствует.
То есть PJSIP не может работать с IPv6 адресами.
Только в системах, где нет getaddrinfo()
.
Аналогично я не могу достучаться до voip6.kolez.com через ping, который судя по всему тоже использует gethostbyname.
- А зачем пульту диспетчера ping?
- ping'у и не надо поддерживать IPv6, он для работы с протоколом ICMP6 не предназначен. Для ICMP6 есть утилита ping6.
comment:8 by , 8 years ago
Replying to dimag:
На данный момент поддержка одновременной работы с IPv4, IPv6 в PJSIP на стадии тестирования и не стабильна.
На основании какой информации Вы сделали такой вывод?
Я в их TRAC'е не вижу открытых тикетов, связанных с IPv6. Поддержка IPv6 реализована ГОДЫ тому назад (в-основном 8 лет назад, последняя существенная правка, касающаяся поддержки IPv6 - 4 года назад)...
follow-up: 12 comment:10 by , 8 years ago
Хотя может быть виноват не PJSIP, а сеть пользователя.
У меня вопрос зачем это надо, что работы с IPv6 мне надо будет перекомпилировать PJSIP, добавив в config_site.h строку #define PJ_HAS_IPV6 1?
comment:11 by , 8 years ago
Вопрос к Александру, нам IPv6, так как наша программа будет работать в Intranetе заказчика по IPv4 протоколу?
comment:12 by , 8 years ago
Replying to dimag:
У меня вопрос зачем это надо, что работы с IPv6 мне надо будет перекомпилировать PJSIP, добавив в config_site.h строку #define PJ_HAS_IPV6 1?
Не понял вопрос... Зачем надо что?
comment:13 by , 8 years ago
Я так понял Дима спрашивает: зачем нам IPv6?
А у заказчика наша программа будет работать как умеет :)
Поддержку IPv6 сделать не помешает, но задача не приоритетная. У тикета приоритет- минор
follow-up: 15 comment:14 by , 8 years ago
Когда разрабатывали протокол IP, не могли себе представить, насколько быстро будет расти Интернет. В результате этого, можно сказать, взрывного роста адреса IPv4 оказались исчерпаны (см. например здесь). В настоящее время Интернет не может расти и развиваться за счет адресов IPv4.
Как решение этой проблемы (а также ряда других проблем IPv4) более 20 лет назад был разработан новый протокол - IPv6. Кроме большого пространства адресов он имеет целый ряд других преимуществ по сравнению с IPм4 (например отсутствие широковещательных пакетов, автоматическая stateless конфигурация хостов в сети, отсутствие фрагментации и т.д.). Хотим мы этого или нет, а рано или поздно переходить на него придется. И если мы хотим производить продукт, который пользуется спросом, надо быть готовыми к тому, что его будут использовать в сети IPv6.
comment:15 by , 8 years ago
Replying to alx:
Хотим мы этого или нет, а рано или поздно переходить на него придется. И если мы хотим производить продукт, который пользуется спросом, надо быть готовыми к тому, что его будут использовать в сети IPv6.
Согласен.
comment:16 by , 8 years ago
Priority: | minor → trivial |
---|
comment:20 by , 8 years ago
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
Формально, проблема решена в r837 - регистрация успешно выполняется.
Однако, есть другая проблема, не позволяющая работать с зарегистрированными таким образом пользователями. Но это уже, похоже, проблема pjsip, а не нашего пульта. Создам по этому поводу отдельный тикет.
Сейчас при ошибке регистрации SIP-клиента в строке состояния диалога "Вход" будет выводиться сообщение "Не удалось инициализировать подсистему SIP".