如何在Sofia SIP中更改SIP BYE消息的目的地

如何在Sofia SIP中更改SIP BYE消息的目的地,sip,sofia-sip,Sip,Sofia Sip,让我先描述一下我的问题。我将Sofia SIP用于电话应用程序,我使用的SIP代理位于NAT后面。这意味着来自代理的传入邀请具有作为联系人标头的内部代理IP(例如10.0.0.1)。这意味着当我从我的应用程序挂断电话时,Sofia会自动将IP 10.0.0.1设置为BYE消息的目的地,正如您所想象的,IP 10.0.1是不可路由的,因此它会失败 所以我想做的是将BYE消息的目的地更改为“外部”代理IP地址。问题是Sofia似乎不允许我更改SIP消息的目的地;它总是使用收到邀请时获得的联系人。以下

让我先描述一下我的问题。我将Sofia SIP用于电话应用程序,我使用的SIP代理位于NAT后面。这意味着来自代理的传入邀请具有作为联系人标头的内部代理IP(例如10.0.0.1)。这意味着当我从我的应用程序挂断电话时,Sofia会自动将IP 10.0.0.1设置为BYE消息的目的地,正如您所想象的,IP 10.0.1是不可路由的,因此它会失败

所以我想做的是将BYE消息的目的地更改为“外部”代理IP地址。问题是Sofia似乎不允许我更改SIP消息的目的地;它总是使用收到邀请时获得的联系人。以下是我尝试过的:

  • 强制SIPTAG_的硬编码值:

    再见(操作->操作手柄, SIPTAG_TO(sip_TO_make(ssc->ssc_home),sip:alice@54.15.123.11")), TAG_END())

  • 这样做的结果是,To报头被外部ip更新,但SIP消息仍然发送到内部代理ip

  • 对NUTAG_URL强制执行硬编码值:

    sip_to_t*to=sip_to_make(ssc->ssc_home),sip:alice@54.15.123.11");

    ua_再见(操作->操作手柄, NUTAG_URL(至->a_URL), TAG_END())

  • 这没有效果

  • 强制SIPTAG_请求_STR的硬编码值:

    再见(操作->操作手柄, SIPTAG_请求_STR(“再见sip:alice@54.15.123.11SIP/2.0“, TAG_END())

  • 这没有效果

  • 执行了相同的操作,但通过事务句柄:

    nua_设置参数(操作->操作句柄,SIPTAG_请求字符串(“再见sip:alice@54.15.123.11SIP/2.0),标记为空()

    nua_bye(op->op_handle,TAG_END())

  • 同样没有效果

    然后,我想在收到来自代理的邀请时提前一点,可能会更改联系人,因为这是发送后续BYE的地方,但同样没有运气:尝试通过nua_set_hparams更新它对使用nua_set_params的全局参数没有同样的效果

    似乎我想做的很简单(考虑到NAT配置,这是必要的),但似乎Sofia明确不允许这样做(如果你查看nua_bye文档,没有任何相关的标签记录)

    我还想过使用索菲亚的一个较低级别的API,比如NTA(而不是NUA),但似乎很难将NUA与任何较低级别的API混合使用

    任何想法都是非常受欢迎的

    致以最良好的祝愿


    Antonis

    BYE是一个in-dialog请求,因此它应该跟随路由头(如果它们存在的话)。我只对Sofia略为熟悉,但如果您将实际收到邀请的IP:port添加到您这边的routeset中,并在您发送未来的in-dialog请求时将其添加到路由头列表中,Sofia应该首先按路由头进行路由,然后是RURI(通常来自另一方的联系人).

    非常感谢您的回答;目前,我找到了一种解决方法,将出站代理传递给Sofia中的nua_create。一旦我有空闲时间,我也会尝试测试一下,让你知道它是否有效