其中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出现故障了你应该关闭现有的链接
如果GPRS出现故障了你应该关闭现有的链接
#2
如何进行心中检测?
#3
如何进行心跳检测?
#4
心跳检测其实就是一种机制
具体的你可以百度一下
简单的说就是服务器每隔一段时间向客户端发送一个检测包
客户端接到这个包后就向服务器发送一个确认包
服务器如果接到确认包就认为客户端工作正常
如果服务器没有接到就认为客户端以出现异常无法正常工作
这时服务器会关闭与客户端的链接
具体的你可以百度一下
简单的说就是服务器每隔一段时间向客户端发送一个检测包
客户端接到这个包后就向服务器发送一个确认包
服务器如果接到确认包就认为客户端工作正常
如果服务器没有接到就认为客户端以出现异常无法正常工作
这时服务器会关闭与客户端的链接
#5
对,用心跳包,可以处理下这种异常情况,网络掉线,断电.
#6
这个我是知道的,我只是知道如何实现对心跳包的检测。
具体点,函数。
#7
简单的,你就定时的发送数据包,然后验证是否是否收到了,是否正确就完了。
#8
1 一般来说gprs模块应该提供这个功能
看一下他的说明吧
2 就用心跳,如果一定的间隔没收到数据就重新启动数据中心
看一下他的说明吧
2 就用心跳,如果一定的间隔没收到数据就重新启动数据中心
#9
你们说的这些我明白,我想知道的问题是如何检测GPRS在线与否?
如果通过检测心跳包,那么如何检测心跳包?
如果检测到一段时间没发心跳包,又如何重启数据中心?关闭现有套接字,再创建新的?
如果通过检测心跳包,那么如何检测心跳包?
如果检测到一段时间没发心跳包,又如何重启数据中心?关闭现有套接字,再创建新的?
#10
这个问题我有点思路了,通过send函数的返回值判断是否有掉线,然后再重新创建套接字。
#11
具体的协议应该是你根据需求自己设置的
函数就是Send喽
#1
心跳检测么
如果GPRS出现故障了你应该关闭现有的链接
如果GPRS出现故障了你应该关闭现有的链接
#2
如何进行心中检测?
#3
如何进行心跳检测?
#4
心跳检测其实就是一种机制
具体的你可以百度一下
简单的说就是服务器每隔一段时间向客户端发送一个检测包
客户端接到这个包后就向服务器发送一个确认包
服务器如果接到确认包就认为客户端工作正常
如果服务器没有接到就认为客户端以出现异常无法正常工作
这时服务器会关闭与客户端的链接
具体的你可以百度一下
简单的说就是服务器每隔一段时间向客户端发送一个检测包
客户端接到这个包后就向服务器发送一个确认包
服务器如果接到确认包就认为客户端工作正常
如果服务器没有接到就认为客户端以出现异常无法正常工作
这时服务器会关闭与客户端的链接
#5
对,用心跳包,可以处理下这种异常情况,网络掉线,断电.
#6
这个我是知道的,我只是知道如何实现对心跳包的检测。
具体点,函数。
#7
简单的,你就定时的发送数据包,然后验证是否是否收到了,是否正确就完了。
#8
1 一般来说gprs模块应该提供这个功能
看一下他的说明吧
2 就用心跳,如果一定的间隔没收到数据就重新启动数据中心
看一下他的说明吧
2 就用心跳,如果一定的间隔没收到数据就重新启动数据中心
#9
你们说的这些我明白,我想知道的问题是如何检测GPRS在线与否?
如果通过检测心跳包,那么如何检测心跳包?
如果检测到一段时间没发心跳包,又如何重启数据中心?关闭现有套接字,再创建新的?
如果通过检测心跳包,那么如何检测心跳包?
如果检测到一段时间没发心跳包,又如何重启数据中心?关闭现有套接字,再创建新的?
#10
这个问题我有点思路了,通过send函数的返回值判断是否有掉线,然后再重新创建套接字。
#11
具体的协议应该是你根据需求自己设置的
函数就是Send喽