2014-04-30 81 views
0

如果您的TCP连接在您的初始订阅的到期计时器内死亡,如何使用SipSorcery创建新订阅? 写信跟我有一个超时时间的运行,当它经过,如果在连接建立这样我检查:与SipSorcery订阅失败

while (!tcpChannel.IsConnectionEstablished(myRemoteEndpoint)) 
{ 
    //... using same from tag, but creating new call id saved as SIPRequest _request... 
    System.Threading.Thread.Sleep(1000 * 60); 
    tcpChannel.Send(myRemoteEndpoint, Encoding.UTF8.GetBytes(_request.ToString()); 
} 

当时的想法是等待60秒,然后尝试发送一个新的订阅服务器,检查连接是否已建立,如果不在60秒后再次运行,则建立连接。

但是.IsConnectionEstablished似乎有点不可靠这个目的...它像while循环阻塞的东西。我可以看到我的SUBSCRIBE请求已发送,但我没有收到有关该请求的任何回复。

任何想法appriciated。

回答

1

您不应该需要执行IsConnectionEstablished检查。当你调用tcpChannel.Send时,它将负责建立到所需端点的新TCP连接(如果不存在的话)。

至于为什么您没有收到您的后续订阅请求的响应,如果你反复重新发送相同的请求不更新所需的标题,如Cseq的,通过branchid,呼叫ID &从标签那么它可能得到标记为重复请求。

此外,您可能希望看看SIPSorcery.SIP.App.SIPNotifierClient,因为它旨在维护与SIP服务器的订阅。

+0

问题是,如果定时器过期时连接仍然关闭,它将尝试发送请求,但因为不会得到任何响应。大约60秒后,我想检查连接,并发送一个新的订阅请求,因为我知道旧的订阅已到期。对此有何建议? – grmihel

+0

当SPTCPChannel类被要求发送消息时,它应该尝试重新建立连接。达到计时器时,您不需要做任何特殊的事情。重新发送时您是否收到任何日志消息? – sipwiz

+0

你看,问题是当我的计时器过去时,定时器正在停止,SendRequest被启动,并且当收到一个响应,并且它是一个200 OK,那么定时器将在接收到的到期时间内再次启动200 OK msg。因此,新定时器的开始在TimerElapsed事件之外。如果在我试图在经过时间发起SendRequest时连接消失了,我将不会得到任何响应,即使在发送请求后重新建立连接,这意味着我的计时器将不会运行,而我的应用程序将“死亡”,这意味着没有更多的SIP通信。任何方式呢? – grmihel