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