最近在做一个服务器程序,用来完成与GPRS数据采集设备之间的通讯,基本功能都可正常实现,数据也很正常,可是在处理GPRS通讯设备断开时遇到了一个巨大的问题,那就是IOCP服务器程序无法监测到GPRS设备何时断开。
    在准备对断开的设备进行处理时发现,GPRS设备在断开时,IOCP服务器端的GetQueuedCompletionStatus没有发生任何反映,这样的话,服务器端就会以为GPRS设备依然连接,此前连接时产生的套接字也会一直存在。
    请问有人知道怎么处理么?麻烦给点意见,多谢。    期待大神Unsinged降临~~

解决方案 »

  1.   

    可否给个例子?我实在找不到比较好用的,特别是如何在iocp中监测心跳包的。多谢了
      

  2.   

         找到一个IOCP心跳方面的例子,不过效果不太理想,对于网络通信的客户端断开与否反映灵敏,但是依然无法监测到GPRS设备的断开。例子地址:http://fxh7622.blog.51cto.com/63841/15900这个例子中使用的心跳包的结构:
    tcp_keepalive = record
      onoff: Integer;
      keepalivetime: Integer;
      keepaliveinterval: Integer;
    end;
    TTCP_KEEPALIVE = tcp_keepalive;
    PTCP_KEEPALIVE = ^tcp_keepalive;SIO_KEEPALIVE_VALS   =IOC_IN or IOC_VENDOR or 4;
    inKeepAlive,OutKeepAlive:TTCP_KEEPALIVE;insize:=sizeof(TTCP_KEEPALIVE);
    outsize:=sizeof(TTCP_KEEPALIVE);主要部分是使用setsockopt(socket,SOL_SOCKET,SO_KEEPALIVE,@opt,sizeof(opt))和WSAIoctl(socket,SIO_KEEPALIVE_VALS,@inKeepAlive,insize,@outKeepAlive,outsize,@outByte,nil,nil)两个函数来设置客户端连接时创建的套接字的keepalive属性和控制套接字的模式,这个方法很简单而且很有效,不过只是针对互联网的客户端断开,GPRS设备断开时依然检测不到。请问谁还有什么类似的例子么?尽量简单点,多谢了。
      

  3.   

    定时检测,如果发现断开了,关闭那个socket,再重连一次
      

  4.   

    GPRS的连接断开你就是检测不到的,最好以心跳包来控制。