您的位置:首页 > 其它

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

2016-12-06 20:40 519 查看
背景:

在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一下(不是)?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐