我正在从事一个涉及GSM/GPRS模块的项目,该模块的作用是使用TCP和Modbus协议通过internet将客户端与某些设备连接起来。现在我正在研究TCP连接方案。
据我所知,如果有一段时间没有流量,GSM网络会自动关闭TCP连接。
我希望检测和维护TCP连接尽可能可靠。也是为了检测半开连接。
连接过程如下:我的GSM模块充当服务器,它在502端口上打开一个套接字,等待客户端读取数据。客户端可以在3分钟或更长时间内定期读取数据。
当客户端与我的模块连接时,它请求一些数据,模块发送所请求的数据并等待其他请求,并保持连接打开。
现在,如果由于其他原因(由于电源故障、GSM网络等原因)连接中断,客户端需要能够再次与模块连接。该模块必须检测断开的连接,并且必须执行操作,以便客户端能够重新连接到它。
为了检测断开的连接,模块定期向客户端发送一些虚拟数据,并检查该数据是否被客户端接收。否则,必须重新建立tcp连接.
问题是:如何解读这种“重建”的联系?
关键是模块必须尽快可用,以响应客户端的请求;这就是为什么我需要TCP连接尽快发挥作用。
PS。该模块只支持AT命令( Quectel M95模块),因此我不能访问TCP堆栈的所有功能。谢谢。(我是TCP堆栈中的新手,所以我可能使用了含义不恰当的技术术语)
发布于 2017-02-20 08:39:21
问题是:如何解读这种“重建”的联系?
理想情况下,客户端应该关注与服务器的连接。客户来来去去。服务器应该继续在端口上listen。
我是否应该关闭当前的TCP连接,并打开一个新的连接,这意味着再次侦听端口502?
不是的。服务器只需确定连接是否已消失,并仅关闭该连接的套接字即可。不用再试着听了。一开始所做的listen应该仍然有效。
我是否应该关闭当前的TCP连接,并尝试按照上次有效TCP连接提供的方式连接到客户端的端口和ip?
服务器将最不关心客户端端口。它无法将连接到客户端。相反,客户端应该重新连接到服务器。
因此,在客户端内置智能,以查找断开的连接,并重新建立与服务器的连接。
发布于 2018-12-18 12:09:42
如果另一端支持,您可以考虑实现TCP KEEP_ALIVE请求和响应。
由于TCP期望应用程序处理这些,所以应用程序必须跟踪套接字状态并适当地关闭它们,即超时时.
在需要的时候打开连接。
https://stackoverflow.com/questions/42339235
复制相似问题