我可以建立到PABX的TCP连接。它提示我可以登录,并收到一些通话记录。但是不久之后,PABX就无缘无故地放下了连接。它肯定得到了ACK,我查看了Wireshark。
this related question CharlesO说
您只需编写TCP侦听器即可接受来自PBX的连接 解析传入的呼叫详细记录(CDR)。
已成功完成Avaya,Panasonic和其他PABX 产品
这是否意味着问题只是设计是“不要打电话给我们,我们会打电话给你”?
答案 0 :(得分:0)
嗅探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;
}
}
还需要处理冗余呼叫日志,因为在重新建立连接时通常会重复这些日志。