我有一个基于pjsip 2.3.0的iOS voip应用程序。
有问题的设备运行iOS 9.3.4,问题似乎也发生在iOS 10 beta上。它连接到从macbook的nat64 / dns64创建的IPV6 wifi网络。
客户端能够正确注册我们的服务器,并且在UDP模式下进行出站呼叫也没有问题(TCP中的一切正常)。
问题在于入站呼叫,当它响应INVITE 200 OK消息时由于以下原因间歇性失败,即使它能够在它之前成功发送100 TRYING。
pjsua_core.c ....
Sent:
2016-07-31T16:49:32.443
<srcipv6:port> -> <dstipv6:port>
1005
SIP/2.0 200 OK Via: SIP/2.0/UDP
--end msg--
tsx0x1401d82a8 ....Error sending Response msg
200/INVITE/cseq=95989621(tdta0x140866000): No route to host
....Transport error, terminating transaction. Err=120065 (No route to host)
pjsua_call.c .Error sending response: No route to host [status=120065]
APIException: API call '::pjsua_call_answer( CALL_REFERENCE,
PJSUA_SIP_RESPONSE_STATUS_OKAY, NULL, NULL )'
failed with result code = 120065 ('No route to host')
请注意,这只会间歇性地发生。在向OKITE发送200 OK后,入站呼叫成功后,后续呼叫成功。 IPV4网络中不存在该问题。
我也进行了数据包捕获,发现其中没有200 OK消息的痕迹,即使pjsua_core.c的跟踪告诉上面的内容。
真诚欢迎任何有关如何进一步处理或有任何修复的意见。
编辑1:
我设法从:: pjsua_call_answer一直调试到方法“sendto”(),调用pjlib / src / pj / sock_bsd.c
/*
* Send data.
*/
PJ_DEF(pj_status_t) pj_sock_sendto(pj_sock_t sock,
const void *buf,
pj_ssize_t *len,
unsigned flags,
const pj_sockaddr_t *to,
int tolen)
{
PJ_CHECK_STACK();
PJ_ASSERT_RETURN(len, PJ_EINVAL);
CHECK_ADDR_LEN(to, tolen);
*len = sendto(sock, (const char*)buf, (int)(*len), flags,
(const struct sockaddr*)to, tolen);
if (*len < 0)
return PJ_RETURN_OS_ERROR(pj_get_native_netos_error());
else
return PJ_SUCCESS;
}
当尝试在ipv6中单独发送200 OK消息时,sendto here返回-1。