AsyncSocket写的客户端Socket,实现当服务器断开连接时弹窗提示

背景:

在MFC里面用AsyncSocket 写了一个客户端程序,一个按钮发数据,当发送数据时发现如果关闭服务器的监听端口依然会提示数据已发送。原因也许是因为异步Socket没有阻塞,connect后会立刻返回?

过程:

于是百度尝试各种方法,有心跳方法,一秒钟连一次服务器,但感觉对于我这个程序过于被动;又尝试在OnConnect的返回值nerrorcode上面下功夫,发现如果刚开始服务器没开的话,点按钮可以提示没有连接,但如果一旦服务器打开,连接,服务器关闭,再点按钮,还是可以提示数据已发送。干脆在按钮的消息响应函数里面Create Socket,然后Connect,这样应该会实现点一次按钮判断一次是否连接好服务器了吧?但是连点两次按钮报错,我想是不是因为Socket没有关闭,然后又去另一个类(异步socket类)的OnConnect函数里加了关闭对话框类里面的socket(GetApp()->GetMainWnd()->clientsocket.close()),无论是否连接成功,都加了(if() else());再试发现还是不行,如果刚开始是连接到服务器,然后服务器关闭端口,再点按钮还是不提示else里面的没有连接。

结果:

在OnClose()函数里实现提示服务器异常即可。连接过程中服务器断开,此时再点发送按钮顺利提示(连接失败)。

void ClientSocket::OnConnect(int nErrorCode)
{
	// TODO: 在此添加专用代码和/或调用基类
	if (nErrorCode == 0) 
	{ 
		AfxMessageBox(_T("连接成功"));
//		AsyncSelect(FD_CLOSE);
		
	}
	else 
	{
		AfxMessageBox(_T("无法连接到门"));
		CClientApp* pApp = (CClientApp*)AfxGetApp();
		CClientDlg* clientdlg = (CClientDlg*)pApp->GetMainWnd();
		clientdlg->clientsocket.Close();
	}
		

	CAsyncSocket::OnConnect(nErrorCode);
}


void ClientSocket::OnClose(int nErrorCode)
{
	// TODO: 在此添加专用代码和/或调用基类
	CClientApp* pApp = (CClientApp*)AfxGetApp();
	CClientDlg* clientdlg = (CClientDlg*)pApp->GetMainWnd();
	clientdlg->clientsocket.Close();
	AfxMessageBox(_T("服务器故障!"));

	CAsyncSocket::OnClose(nErrorCode);
}void CClientDlg::OnBnClickedSend()
{
	clientsocket.Create(1678, SOCK_STREAM, FD_CONNECT | FD_WRITE | FD_READ | FD_CLOSE);
	clientsocket.Connect(_T("192.168.58.49"), 2345);
}

后记:

感觉很神奇,竟然慢慢摸索出来了 哈哈 。但是很多原理性东西不是很清楚。OnConnect()等函数是不是等Connect后触发的呢?它们依赖于函数触发?(事件)FD_CONNECT是不是也可以呢?OnClose()应该是事件触发的。因为服务器一关闭端口就可以响应,前提是不是也要FD_CLOSE一下(不是)?

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值