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()函数里实现提示服务器异常即可。连接过程中服务器断开,此时再点发送按钮顺利提示(连接失败)。
后记:
感觉很神奇,竟然慢慢摸索出来了 哈哈 。但是很多原理性东西不是很清楚。OnConnect()等函数是不是等Connect后触发的呢?它们依赖于函数触发?(事件)FD_CONNECT是不是也可以呢?OnClose()应该是事件触发的。因为服务器一关闭端口就可以响应,前提是不是也要FD_CLOSE一下(不是)?
在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一下(不是)?
相关文章推荐
- 客户端怎么判断Socket连接已与服务器断开
- Android简单实现Socket通信,客户端连接服务器后,服务器向客户端发送文字数据
- 服务器中判断客户端socket断开连接的方法【转】
- Android 使用Socket实现服务器与手机客户端的长连接四:使用回调函数与Service调用
- 服务器中判断客户端socket断开连接的方法
- loadrunner使用socket协议来实现客户端对服务器产生压力实例。(通过发送心跳包,达到连接多个客户端的目的)
- Android 使用Socket实现服务器与手机客户端的长连接七:定义消息体,区分是响应还是回复信息
- GCDAsyncSocket不通过服务器进行客户端间直接连接—iOS移动开发
- linux下socket编程实现一个服务器连接多个客户端
- 服务器中判断客户端socket断开连接的方法
- 服务器中判断客户端socket断开连接的方法
- Android 使用Socket实现服务器与手机客户端的长连接三:clientA 发送给clientB,定点发送
- 服务器中判断客户端socket断开连接的方法
- 服务器中判断客户端socket断开连接的方法
- socket实现多个客户端连接在一个服务器上
- 什么是socket?什么是socket的长、短连接?java如何简单实现socket客户端和服务器?
- Android 使用Socket实现服务器与手机客户端的长连接七:定义消息体,区分是响应还是回复信息
- Android 使用Socket实现服务器与手机客户端的长连接一:一对一聊天
- 用C#中的Socket连接实现服务器与客户端通信
- Android 使用Socket实现服务器与手机客户端的长连接五:使用队列封装请求