用CSocket类,怎么判断服务端是否断开,又自动连接另一台Socket服务器?

duanfeng 2001-09-27 10:53:27
用CSocket类,怎么判断服务端是否断开,又自动连接另一台Socket服务器?
...全文
1332 35 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixuyu 2001-10-31
  • 打赏
  • 举报
回复
gz:)
清泉ys 2001-10-31
  • 打赏
  • 举报
回复
WSAAsyncSelect(m_sSocket,m_hWnd,WM_CLIENT_CLOSE,FD_CLOSE);
在WM_CLIENT_CLOSE中关闭m_sSocket然后重新connect
use_id 2001-10-31
  • 打赏
  • 举报
回复

说来说去没有一个是解决的好方法。
gstan 2001-10-25
  • 打赏
  • 举报
回复
push
ggzzkk 2001-10-03
  • 打赏
  • 举报
回复
up
fmding 2001-10-02
  • 打赏
  • 举报
回复
up
stlyy 2001-10-01
  • 打赏
  • 举报
回复
to up:
不需要考虑服务端的状态,因为任何的一个发送和接收动作,windows会检查,错误检查实际是由TCP/IP协议进行的,它来维护连接.若服务端有问题,客户端任何交互动作,都会失败,而失败后windows将提供错误返回,对于客户端只需检查每一个动作的返回值即可,最好在动作前加一个设置超时的函数,可通过select()+time或Set...State()(记不太清楚了).
stlyy 2001-10-01
  • 打赏
  • 举报
回复
检测(win32 api)send和recv函数的返回值,如果是SOCKET_ERROR,说明客户或服务端的socket或网路有问题,这时可以直接关闭socket,重新连接,可在连接过程中找到问题的位置.
bighead 2001-10-01
  • 打赏
  • 举报
回复
>>如果是服务器死机重启,客户端又不通过发送检测包来检测,该如何判断是否需重连?
>>(服务器正常退出时,客户端会收到消息的)

这时是不是client能得到connection reset的错误??
jatom 2001-10-01
  • 打赏
  • 举报
回复
用send函数,向soket发一个零字节数据,检查send函数的返回值。
fmding 2001-10-01
  • 打赏
  • 举报
回复
UP
zhuang094 2001-09-29
  • 打赏
  • 举报
回复
如果是发送检测包,那自然就简单了,一旦检测到发送失败,立刻重连就是。
可是,如果一台服务器同时有几百个客户端连在上面,如果每台客户端都定时发包检测,呵呵,服务器端岂不是要增添很大负担.
Ashura 2001-09-29
  • 打赏
  • 举报
回复
好像没见过这样的解决方案,实际上我也是通过发包
来检测网络连接的(在数据传输过程里),发送完毕
才依赖消息。
zhuang094 2001-09-29
  • 打赏
  • 举报
回复
如果是服务器死机重启,客户端又不通过发送检测包来检测,该如何判断是否需重连?
(服务器正常退出时,客户端会收到消息的)
Ashura 2001-09-29
  • 打赏
  • 举报
回复
怎么?很简单的呀。
m_pdlg是构造CClitSok类时传入的
对话框类this指针,UM_SOKCLOSE是WM_USER+1024。
没用过自定义消息吗?
wmouse 2001-09-29
  • 打赏
  • 举报
回复
gz
duanfeng 2001-09-29
  • 打赏
  • 举报
回复
大侠,不懂PostMessage(m_pDlg->GetSafeHwnd(), UM_SOKCLOSE//一个自定义消息,0,0)这句话
caiyi9000 2001-09-29
  • 打赏
  • 举报
回复
不好意思,刚才有点错了,应该用MySocket类定义m_ClientSocket,而不是CSocket类。
即:MySocket m_ClientSocket;
caiyi9000 2001-09-29
  • 打赏
  • 举报
回复
我从来没用过CSocket类做SOCKET编程。但我想:
CSocket类从CAsyncSocket类继承而来,应该遵循异步模式,即创建一个CSocket类的对象时,此对象自动会注册accept,connect,read,write,close等网络事件。因此它应该有OnClose()这个虚函数。而OnClose()函数正是响应连接对端断开事件的函数。但CSocket类显然不会为你作好相应的对端断开的处理功能,因此你只要从CSocket类继承一个类,并重载OnClose()函数即可。具体步骤如下:
(1)在你的客户端程序中增加一个类,从CSocket类继承来
class MySocket : public CSocket
(2)用此类定义一个对象,用与服务器进行连接和通信。
CSocket m_ClientSocket;
m_ClientSocket.Connect();
m_ClientSocket.Send();
m_ClientSocket.Recv();
(3)在MySocket的类文件中重载OnClose()函数,
MySocket::OnClose(int nErrorCode)
{
//做你想做的事
}

服务器一旦断开,客户端程序肯定会执行到此函数(这是异步socket已经封装好的功能),所以你只要在此函数中做服务器断开的善后工作。
duanfeng 2001-09-28
  • 打赏
  • 举报
回复
大侠,不懂PostMessage(m_pDlg->GetSafeHwnd(), UM_SOKCLOSE//一个自定义消息,0,0)这句话
加载更多回复(15)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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