我们一直在开发一个使用C#的.NET框架4.6.1应用程序,它的任务之一是通过局域网连接(Wi-Fi或以太网)将NMEA0183语句发送到多路复用器。可以将应用程序配置为使用TCP或UDP进行连接。应用程序和多路复用器之间的通信在UDP上工作了几个小时,没有任何问题,但是TCP连接有这个问题,我在自己的测试场景中一直使用的ShipModul多路复用器在大约10到15分钟后强制关闭连接。此外,该应用程序的其他用户已经确认,当应用程序配置为使用TCP时,其他多路复用器可能根本无法工作,但UDP连接仍然可以正常工作。从.NET框架应用到多路复用器的通信是单向的。
TCP连接过早关闭的原因可能是什么?是否存在一些要求和机制来主动保持连接处于活动状态,而不是仅仅假定连接在从PC到达时处于活动状态?如果需要主动维护连接,那么如何使用.NET TcpClient object来实现呢?
简单地说,代码类似于(仅在使用TCP时执行):
// connection initilization
tcpClient = new TcpClient(new IPEndPoint(unicastAddress.Address, port));
tcpClient.Connect(ipAddress, port);
networkStream = tcpClient.GetStream();
// ..prepare the NMEA sentence data..
networkStream.Write(asciiEncodedNmeaData, 0, asciiEncodedNmeaData.Length);代码的相应UDP协议版本(仅在使用UDP时执行):
// connection initialization
udpClient = new UdpClient(new IPEndPoint(unicastAddress.Address, port));
udpClient.Connect(ipAddress, port);
// ..prepare the NMEA sentence data..
udpClient.Send(asciiEncodedNmeaData, asciiEncodedNmeaData.Length);此外,当应用程序关闭/暂停时,根据使用的协议,在上面的客户端对象上调用Close()方法(当应用程序未暂停时,一切都会重新启动):
tcpClient.Close();
networkStream.Close();或者:
udpClient.Close();然后,大约15分钟后出现这样的异常: System.IO.IOException:“无法将数据写入传输连接:现有连接被远程主机强制关闭。”
发布于 2021-10-29 10:31:41
这是一个标准的情况。TCP连接是有状态的,即消耗有限的资源,如内存。这就是网络设备通常会丢弃非活动连接的原因。在您的情况下,连接被认为是“大约10或15分钟后”的空闲。
为了避免这种情况,您可以发送"keep alive packets“。只需通过定时器将任何数据(越少越好)写入networkStream,例如每5分钟写入一次。
https://stackoverflow.com/questions/69683244
复制相似问题