小问题,大放分!如何知道连接断开?

lifengnm 2004-06-25 03:09:28
我用MFC的CSocket做服务端程序,当跟客户端连接好后,我不主动接收数据,只是在客户端发过来数据后,在Socket的自动响应函数OnReceive()里用Receive()函数接收数据,请问大家,我这样做怎么才能知道客户端跟我断开连接。我试过了,断开以后Receive函数没有返回值的。
...全文
201 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
btbq 2004-06-28
  • 打赏
  • 举报
回复

就像你的OnReceive()一样,CAsyncSocket、CSocket有一虚函数OnClose(),当该函数激活时就是连接断开时。当OnClose()被激活时用一个数据成员记录即可,其他操作前可以先检测该记录值。
lifengnm 2004-06-28
  • 打赏
  • 举报
回复
昨天找人问了一下,他说TCP通讯不能得到掉线的信号,现在很是郁闷啊…………
huang_yu 2004-06-28
  • 打赏
  • 举报
回复
TO: btbq(阿不)

GetSockOpt

Call this member function to retrieve a socket option. GetSockOpt retrieves the current value for a socket option associated with a socket of any type, in any state, and stores the result in lpOptionValue. Options affect socket operations, such as the routing of packets, out-of-band data transfer, and so on.


SELECT 能得到TCP连接的信息,但不能得到如拔网线等异常信息,若正常关闭,则SELECT可以得到CLOSE的消息。
像你的情况,客户端是不能改的了,那就好好考虑一下系统传输的特性。比如,若CLIENT端超过5秒钟没有数据过来,则认为是断线。
像硬件的客户端,一般都是联了服务器就不停发数据,若服务器几秒钟都收不到,肯定出问题了。
正常关闭的话会受到SOCKET CLOSE的消息。
jiudon 2004-06-28
  • 打赏
  • 举报
回复
看书贝,书上讲解的很详细,关于select或者其它的io模型,呵呵!
lifengnm 2004-06-28
  • 打赏
  • 举报
回复
为什么到现在都没有解决啊???????????????
btbq 2004-06-26
  • 打赏
  • 举报
回复
GetSockOpt
lifengnm 2004-06-26
  • 打赏
  • 举报
回复
不行的,我的客户端是硬件设备,它一启动就要自动拨号登录到服务端,服务端只能是被动的接受它传过来的信号,所以只能这样做,但是服务端又必须知道它掉线状态。
谁知道SELECT()怎么用,是不是那个可以做到我的要求?麻烦大家告诉我。
skyupsky 2004-06-25
  • 打赏
  • 举报
回复
你的问题应该是一种防错机制,但是像判断网线被拔掉之类的错误就很难了!也不会有什么办法能够实现的,心跳信息也应该不符合你的要求!
但是你想想,你有必要非得关闭这个链接吗?
或者你可以采取一些别的办法,你可以在一段时间以后关闭非活动的链接,或者干脆就每通讯一次链接一次,然后在结束的时候就关闭这个链接!

郁闷中回答,有用就看看吧!
月吻长河 2004-06-25
  • 打赏
  • 举报
回复
使用心跳
Client和Server定时握手
PiggyXP 2004-06-25
  • 打赏
  • 举报
回复
CSocket我不是很熟悉,我大喜欢这个东西

好像它是没有办法处理非正常断开的情况,需要自己手动来处理,就是发送“心跳包”,楼上已经说得很详细了

其实不如用现成的I/O模型,就可以很方便的处理非正常断开的情况了
kvls 2004-06-25
  • 打赏
  • 举报
回复
1、如果是正常断开,即软件主动将socket Close的,你会收到消息,上面有说。
2、非正常断线一般采用所谓的“心跳协议”,简单又实用。比如客户端一秒时间内发送一次在线信号。服务端设置一个变量i = 5 每隔1秒收不到信号就--i,如果i=0表示断线。如果收到信号将i=5,这样5秒为断线等待时间。
beijingshizi 2004-06-25
  • 打赏
  • 举报
回复
CAsyncSocket 里面有说明!
beijingshizi 2004-06-25
  • 打赏
  • 举报
回复
Overridable Notification Functions

OnClose Notifies a socket that the socket connected to it has closed.
OnConnect Notifies a connecting socket that the connection attempt is complete, whether successfully or in error.
findcsdn 2004-06-25
  • 打赏
  • 举报
回复
客户端端开了会有disconnected消息的
MFCClass 2004-06-25
  • 打赏
  • 举报
回复
VCKBASE里有一个MYQQ是用CSOCKET做的。比较全了,发送消息和文件

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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