向INVITE

时间:2016-08-31 19:02:01

标签: ios udp ios9 voip pjsip

我有一个基于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。

0 个答案:

没有答案