我可以建立到 PABX 的 TCP 连接。它提示我可以登录,并接收一些通话记录。但不久之后,PABX 无缘无故地断开了连接,我无法理解。它肯定会收到 ACK,我用 Wireshark 检查过。
在这个相关的问题中,CharlesO 说
您只需编写一个 TCP 侦听器来接受来自 PBX 的连接并解析传入的呼叫详细记录 (CDR)。
已通过 Avaya、Panasonic 和其他 PABX 产品成功地做到了这一点
这是否意味着问题仅仅是设计是“不要打电话给我们,我们会打电话给你”?
嗅探 PABX 和商业呼叫记录器之间的流量会发现 PABX 经常无缘无故地断开连接,任何希望记录呼叫数据的应用程序都必须监视连接状态。
由于 TcpClient 在写入失败之前不会检测到状态的变化,并且这严格来说是一个监听套接字,因此需要一种更直接的连接状态方法:
public static class Extensions
{
/// <summary>
/// Obtain the current state of the socket underpinning a TcpClient.
/// Unlike TcpClient.Connected this is reliable and does not require
/// capture of an exception resulting from a failed socket write.
/// </summary>
/// <param name="tcpClient">TcpClient instance</param>
/// <returns>Current state of the TcpClient.Client socket</returns>
public static TcpState GetState(this TcpClient tcpClient)
{
var foo = IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpConnections()
.SingleOrDefault(x => x.LocalEndPoint.Equals(tcpClient.Client.LocalEndPoint));
return foo != null ? foo.State : TcpState.Unknown;
}
}
处理冗余呼叫日志也是必要的,因为在重新建立连接时这些经常重复。