使用完成端口的问题! ( 积分: 100 )

  • 主题发起人 主题发起人 zzpphhdd
  • 开始时间 开始时间
Z

zzpphhdd

Unregistered / Unconfirmed
GUEST, unregistred user!
我是刚学网络编程的新手,我最近采用完成端口模型编了一个服务器单元,运行基本良好,但有一个问题使我百思不得其解,那就是在完成端口下如果客户端异常断开(如:客户端将网线拔掉)时,我的服务器端检测不到错误,而是仍然保持连接,我也知道Get函数有一个超时值,但是超时返回的时候并不能返回单句柄数据从而无法得知是哪个客户超时,请问各位大富翁如何来解决此问题?该问题十分紧迫,请大家帮帮忙!谢谢!
 
我是刚学网络编程的新手,我最近采用完成端口模型编了一个服务器单元,运行基本良好,但有一个问题使我百思不得其解,那就是在完成端口下如果客户端异常断开(如:客户端将网线拔掉)时,我的服务器端检测不到错误,而是仍然保持连接,我也知道Get函数有一个超时值,但是超时返回的时候并不能返回单句柄数据从而无法得知是哪个客户超时,请问各位大富翁如何来解决此问题?该问题十分紧迫,请大家帮帮忙!谢谢!
 
创建一个连接应该有对象句柄,超时应该会返回哪个句柄超时,不过将某个句柄和客户关联起来。。。??,什么意思?你的连接是什么连接??
 
非常感谢cyradg的关注!我做过一个试验,分别在两台机器上运行两个客户端对服务器发起连接,然后我将其中一台的网线拔掉,但是Get函数超时后并不能正确返回被断掉的客户端单句柄数据!我采用的是Accept阻塞式连接!其他一切都是完成端口的经典处理过程!此问题真的很难解决?
 
不记得Accept是哪个控件函数,参阅一下WaitForMultipleObjects函数吧
 
Accept是Winsock API的阻塞式接受函数呀,你说的那个Wait函数我也知道,并且有一个MsgWaitForMultipleObject函数也可以,比这个函数更好用,但是这有点多余啊,我的Get函数就可以接收完成通知的,我觉得是不是应该设置些什么东西?轮询肯定是不好的方式,要求客户端发“存活”消息也不太现实,因为我就在服务器端控制就行了,一直找不到好办法,可能也是对完成端口不熟悉!
 
定个心跳协议定时向客户端发包就可以检测到异常断线的用户了. 不然的话无法知道对方已经断了
 
谢谢Another_eYes,您说的这种方式是不是这个意思:我服务器定时向每个已连接上的客户发送协议数据包,然后等待客户返回确认,如果超时,那就认为客户端已经断开,这是不是轮询的意思?可是要对数量众多的客户端进行轮询,那效率是不是会降低呢?不知道我的理解是否正确。
另外,因为我初学者,以前没有编过网络程序,手边也没有现成的源代码可以借鉴,您能不能给个例子我参考一下呢?(如何来定义心跳协议及使用它来检测网络连接),非常感谢您!
 
分数不够我可以再加,真心希望有经验的大富翁给予我帮助,我将非常感谢!
 
1.在会话的结构中添加 lastTime:TDateTime;当会话成功读/写时更新lastTime:=now;
2.软件中添加一个Timer,每秒触发一次,触发时遍历每个会话,当 now-???.lastTime>你限定的值,强制关闭会话.
我的网络代理软件就用这种方法.
 
谢谢指教,我想这也是一个轮询的方法,但只做很少的操作,应该不失为一个比较好的方法,我先试试,非常感谢tianhf!还有其他方法吗?
 
最好开线程来做判断,用TIMER会有出错的情况
 
Timer本身的运行机制也应该就是一个线程吧?应该区别不会很大吧??不是太明白,请高手赐教!
 
zzpphhdd 说的对,Timer本身就是一个线程.
 
感谢tianhf,我昨天按照此方法做了一个试验,基本上达到了目的,然后我与borland的Scktsrvr源码进行了对比,我发现它基本上的超时也是这个机制,不过它是使用msgwaitmultipleobjects函数的定时检查,每隔一分钟检查一次!其实我现在的工作就是将这个scktsrvr的通信机制用完成端口来实现,发现还有不少问题,正在摸索中!结帖了!
 
多人接受答案了。
 
后退
顶部