如何实现数据中心(套接字,TCP)和GPRS在永久在线?

时间:2022-08-30 11:04:06
本人编写了一个上位机软件,用以实现GPRS数据中心的功能,需要能够不停地接收通过GPRS模块发送过来的数据。
其中GPRS模块采用了中心对多点的工作模式,GPRS数据中心采用套接字,TCP方式收发数据。首先启动数据中心,点击一个BEGIN按钮运行如下一段程序:
void CTestDlg::OnBegin() 
{
// TODO: Add your control notification handler code here
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}


if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return; 

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY    
   
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(2020);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));/*将套接字绑定到本地某个地址和端口中*/

listen(sockSrv,5);/*将指定的套接字设置为监听模式*/

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);


}
运行这段程序,给GPRS模块上电后,GPRS模块和数据中心可以建立起连接,并进行数据的收发。
但由于GPRS信号问题吧,GPRS模块有时候会掉线,然后GPRS模块会自动重启进行连接,并会显示连接成功的信息。
但再次连接成功后通过通过GPRS模块给数据中心发数据,数据中心却收不到,GPRS也无法接收到数据中心发的数据。如果此时再点击BEGIN按钮,也不会有任何反应。除非将数据中心关闭,重启再连接,才能进行数据的收发。

我个人的想法是,有没有一个函数来检测GPRS的在线状况,如果有一个函数能返回一个GPRS模块在线与否的信息,那么就可以在一个定时器时添加判断语句,一旦GPRS掉线,就关闭已经建立的套接字,重新建立一个套接字。
不知有没有一个返回GPRS模块在线与否的函数,请高人指点。
或者有其它方法来实现这个GPRS模块掉线后,数据中心与之重连接的问题,也请指教。(多线程好像比较难,我看了三礼拜,还是不得其门而入。)
另外,如何关闭一个已经建立的套接字?

11 个解决方案

#1


心跳检测么
如果GPRS出现故障了你应该关闭现有的链接

#2


引用 1 楼 xianglitian 的回复:
心跳检测么
如果GPRS出现故障了你应该关闭现有的链接


如何进行心中检测?

#3


引用 1 楼 xianglitian 的回复:
心跳检测么
如果GPRS出现故障了你应该关闭现有的链接


如何进行心跳检测?

#4


心跳检测其实就是一种机制
具体的你可以百度一下
简单的说就是服务器每隔一段时间向客户端发送一个检测包
客户端接到这个包后就向服务器发送一个确认包
服务器如果接到确认包就认为客户端工作正常
如果服务器没有接到就认为客户端以出现异常无法正常工作
这时服务器会关闭与客户端的链接

#5


对,用心跳包,可以处理下这种异常情况,网络掉线,断电.

#6


引用 4 楼 xianglitian 的回复:
心跳检测其实就是一种机制
具体的你可以百度一下
简单的说就是服务器每隔一段时间向客户端发送一个检测包
客户端接到这个包后就向服务器发送一个确认包
服务器如果接到确认包就认为客户端工作正常
如果服务器没有接到就认为客户端以出现异常无法正常工作
这时服务器会关闭与客户端的链接


这个我是知道的,我只是知道如何实现对心跳包的检测。
具体点,函数。

#7


简单的,你就定时的发送数据包,然后验证是否是否收到了,是否正确就完了。

#8


1 一般来说gprs模块应该提供这个功能
看一下他的说明吧

2 就用心跳,如果一定的间隔没收到数据就重新启动数据中心

#9


你们说的这些我明白,我想知道的问题是如何检测GPRS在线与否?
如果通过检测心跳包,那么如何检测心跳包?
如果检测到一段时间没发心跳包,又如何重启数据中心?关闭现有套接字,再创建新的?

#10


这个问题我有点思路了,通过send函数的返回值判断是否有掉线,然后再重新创建套接字。

#11


引用 6 楼 laozhuang555 的回复:
引用 4 楼 xianglitian 的回复:
心跳检测其实就是一种机制
具体的你可以百度一下
简单的说就是服务器每隔一段时间向客户端发送一个检测包
客户端接到这个包后就向服务器发送一个确认包
服务器如果接到确认包就认为客户端工作正常
如果服务器没有接到就认为客户端以出现异常无法正常工作
这时服务器会关闭与客户端的链接


这个我是知道的,我只是知道如何实现对心跳包的检测。
……

具体的协议应该是你根据需求自己设置的
函数就是Send喽

#1


心跳检测么
如果GPRS出现故障了你应该关闭现有的链接

#2


引用 1 楼 xianglitian 的回复:
心跳检测么
如果GPRS出现故障了你应该关闭现有的链接


如何进行心中检测?

#3


引用 1 楼 xianglitian 的回复:
心跳检测么
如果GPRS出现故障了你应该关闭现有的链接


如何进行心跳检测?

#4


心跳检测其实就是一种机制
具体的你可以百度一下
简单的说就是服务器每隔一段时间向客户端发送一个检测包
客户端接到这个包后就向服务器发送一个确认包
服务器如果接到确认包就认为客户端工作正常
如果服务器没有接到就认为客户端以出现异常无法正常工作
这时服务器会关闭与客户端的链接

#5


对,用心跳包,可以处理下这种异常情况,网络掉线,断电.

#6


引用 4 楼 xianglitian 的回复:
心跳检测其实就是一种机制
具体的你可以百度一下
简单的说就是服务器每隔一段时间向客户端发送一个检测包
客户端接到这个包后就向服务器发送一个确认包
服务器如果接到确认包就认为客户端工作正常
如果服务器没有接到就认为客户端以出现异常无法正常工作
这时服务器会关闭与客户端的链接


这个我是知道的,我只是知道如何实现对心跳包的检测。
具体点,函数。

#7


简单的,你就定时的发送数据包,然后验证是否是否收到了,是否正确就完了。

#8


1 一般来说gprs模块应该提供这个功能
看一下他的说明吧

2 就用心跳,如果一定的间隔没收到数据就重新启动数据中心

#9


你们说的这些我明白,我想知道的问题是如何检测GPRS在线与否?
如果通过检测心跳包,那么如何检测心跳包?
如果检测到一段时间没发心跳包,又如何重启数据中心?关闭现有套接字,再创建新的?

#10


这个问题我有点思路了,通过send函数的返回值判断是否有掉线,然后再重新创建套接字。

#11


引用 6 楼 laozhuang555 的回复:
引用 4 楼 xianglitian 的回复:
心跳检测其实就是一种机制
具体的你可以百度一下
简单的说就是服务器每隔一段时间向客户端发送一个检测包
客户端接到这个包后就向服务器发送一个确认包
服务器如果接到确认包就认为客户端工作正常
如果服务器没有接到就认为客户端以出现异常无法正常工作
这时服务器会关闭与客户端的链接


这个我是知道的,我只是知道如何实现对心跳包的检测。
……

具体的协议应该是你根据需求自己设置的
函数就是Send喽