WinSock怎样判断GPRS终端设备意外断开?

mndsoft 2007-04-24 02:44:13
大家知道,用 WinSock控件编写C/S程序的时候,在WinSock_Close或者WinSock_Error事件里可以获取客户端关闭的信息(哪怕是客户端程序意外关闭,都会在服务器端产生WinSock_Close事件,从而可以知道客户端已经断开连接)。

我的问题是,如果客户端是GPRS连接的终端设备,如果断开了,好像WinSock_Close和WinSock_Error事件就无法获取了。请问这个怎么解决?大家有没有好的方法知道GPRS终端设备意外断网,服务器马上就能知道(不要发送数据来判断客户端)。

目前的GPRS设备的模块是SIMCOM300,采用DNS域名访问。

谢谢。
...全文
407 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
CathySun118 2007-04-24
  • 打赏
  • 举报
回复
终端断开后下次又连接过来时,你根据终端IP,更改相应的TerminalInfo结构体中的 inUSE的值就行了.
你可以定义一个TerminalInfo类型的数组,类保存终端信息,
当终端连接时,你可以根据终端Ip是否在保存的数组中来判断是否新的终端,新的连接分配Winsock控件,否则更新.
但,对不是固定Ip的终端这种方法不行,如果这样,需要设置超时时间,比如30分钟,如果在30分钟内,没有通讯,就删除该终端的所有信息.
mndsoft 2007-04-24
  • 打赏
  • 举报
回复
楼上的方法是可行的。

我刚刚测试过了,好像其他的程序在意外断电后也无法获取终端状态,只能查询的方式了。

现在我这边的是终端每15分钟向服务器发送心跳包,我采用的是动态加载WinSock控件数组的方法,即产生WinSock_ConnectionRequest事件时就自动分配加载一个WinSock控件数组,并在DataArrival事件接收终端的信息,提取数据后放到定义的终端信息结构体中,如下:
Private Type TerminalInfo
inUse As Boolean '来判断使用状态
Verified As Boolean
Name As String '终端名称
Code As String '终端编码
IP As String '终端IP地址
PORT As String '终端端口
ConSUM As Integer '连接总数
Away As Byte
End Type 结构体内。

我的问题是,如果终端断开后下次又连接过来,而服务器中的TerminalInfo结构体中的 inUSE还是 True,可能会造成数据乱掉。

有没有获取终端断开后办法刷新结构体,以便下次重新加载分配WinSock控件,这样就避免了重复加载WinSock控件造成资源浪费。
谢谢楼上。
CathySun118 2007-04-24
  • 打赏
  • 举报
回复
GPRS连接的终端设备,如果断开了,WinSock_Close和WinSock_Error事件无法获取.
这样只能用心跳包来判断是否链接,可以定义字节数非常小的心跳包,定时的发送,接收到心跳包返回说明连接正常,否则,链路故障.
我们做监控系统都是这样做的

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧