首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP连接被ShipModul的Miniplex-3Wi强制关闭

TCP连接被ShipModul的Miniplex-3Wi强制关闭
EN

Stack Overflow用户
提问于 2021-10-22 21:27:35
回答 1查看 44关注 0票数 0

我们一直在开发一个使用C#的.NET框架4.6.1应用程序,它的任务之一是通过局域网连接(Wi-Fi或以太网)将NMEA0183语句发送到多路复用器。可以将应用程序配置为使用TCP或UDP进行连接。应用程序和多路复用器之间的通信在UDP上工作了几个小时,没有任何问题,但是TCP连接有这个问题,我在自己的测试场景中一直使用的ShipModul多路复用器在大约10到15分钟后强制关闭连接。此外,该应用程序的其他用户已经确认,当应用程序配置为使用TCP时,其他多路复用器可能根本无法工作,但UDP连接仍然可以正常工作。从.NET框架应用到多路复用器的通信是单向的。

TCP连接过早关闭的原因可能是什么?是否存在一些要求和机制来主动保持连接处于活动状态,而不是仅仅假定连接在从PC到达时处于活动状态?如果需要主动维护连接,那么如何使用.NET TcpClient object来实现呢?

简单地说,代码类似于(仅在使用TCP时执行):

代码语言:javascript
复制
// 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时执行):

代码语言:javascript
复制
// 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()方法(当应用程序未暂停时,一切都会重新启动):

代码语言:javascript
复制
tcpClient.Close();
networkStream.Close();

或者:

代码语言:javascript
复制
udpClient.Close();

然后,大约15分钟后出现这样的异常: System.IO.IOException:“无法将数据写入传输连接:现有连接被远程主机强制关闭。”

EN

回答 1

Stack Overflow用户

发布于 2021-10-29 10:31:41

这是一个标准的情况。TCP连接是有状态的,即消耗有限的资源,如内存。这就是网络设备通常会丢弃非活动连接的原因。在您的情况下,连接被认为是“大约10或15分钟后”的空闲。

为了避免这种情况,您可以发送"keep alive packets“。只需通过定时器将任何数据(越少越好)写入networkStream,例如每5分钟写入一次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69683244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档