我正在尝试读取IP电话系统的输出。我当前的实现是使用Streamreader.ReadAsync()从流中一次读取一个char到结果字符串,然后当我点击电话系统提供的自定义行终止符时,我正在解析结果字符串并存储数据。这是一个示例:
using (var monitor = new TcpClient(ip, port))
{
try
{
using (var reader = new StreamReader(monitor.GetStream()))
{
var streamChar = new char[1];
while (true)
{
await reader.ReadAsync(streamChar, 0, streamChar.Length);
我发现这个实现在白天工作正常,但是在下午5点之后我不再记录数据。我正在将读取的内容吐出到文件中,并且我发现在日志记录停止时提供的原始数据没有区别。当ReadAsync()方法挂起时,我仍然看到使用netstat打开套接字。我今晚测试并确认如果我只是允许应用程序创建一个新的TcpClient连接到日志应用程序的同一个实例中的同一个源,它就会开始正常接收数据。
我以前曾尝试使用reader.EndOfStream和reader.Peek()来确定何时读取下一个char,但切换到此实现,因为我的理解是EndOfStream和Peek是阻塞操作。我已经看到应用程序在这些条件下挂起,所以我摆脱了它们并根据您在收到新呼叫时永久发送数据的理解将其替换为您所看到的内容。
我正在联系,看看是否有人可以确认我的实施是否有缺陷,或者我是否需要开始更多地关注电话系统本身。谢谢你的帮助。
答案 0 :(得分:0)
我决定通过以周期性间隔将单个字节写回端点来补偿超时。这解决了问题,现在连接仍然存在。我不得不处理端点提供的响应,但它只回复我简单丢弃的旧呼叫数据。