CAsyncSocket的函数OnClose(int nErrorCode)的问题

hahacker 2012-09-21 10:17:13
void CMySocket::OnClose(int nErrorCode)
{
// if (nErrorCode == 0)
// {
m_pWnd->OnClose();
// }

CAsyncSocket::OnClose(nErrorCode);
}
CMySocket是派生自CAsyncSocket的类,是用于通信socket的类,重载了这个OnClose,想捕获通信socket关

闭的消息。但是不太明白的是,为什么只有把if (nErrorCode == 0)注释掉后没有问题,不注释掉的话,

里面的m_pWnd->OnClose();就不会被调用,而别的如OnAccept, OnReceive,OnSend,写在这个if

(nErrorCode == 0)内却能调用。。。为什么会这样呢???
...全文
319 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2012-09-22
  • 打赏
  • 举报
回复
MSDN里有解释nErrorCode的值的含义:
nErrorCode
The most recent error on a socket. The following error codes apply to the OnClose member function:

0 The function executed successfully.

WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.

WSAECONNRESET The connection was reset by the remote side.

WSAECONNABORTED The connection was aborted due to timeout or other failure.
Geoff08Zhang 2012-09-21
  • 打赏
  • 举报
回复
#3楼说的没错,CAsyncSocket只不过把Windows socket做了封装,当WinSock收到FD_CLOSE消息时会调用封装的OnClose函数.在FD_CLOSE消息里nErrorCode不是错误码,Microsoft这个名字起的不好,而是对方以何种方式关闭了连接.关闭连接有两个报文:
FIN, 这是对方正常关闭了连接,收到的错误码为0.
RESET, 对方强制关闭了连接,收到的是WSAECONNRESET,非0.
所以,在OnClose中无论nErrorCode是多少,都要关闭socket.
youngwolf 2012-09-21
  • 打赏
  • 举报
回复
OnClose里面不要关心nErrorCode值,不管它等于多少,连接都是被关闭了。
youngwolf 2012-09-21
  • 打赏
  • 举报
回复
出错的情况下,也会关闭套接字,也会调用OnClose的。
我不知道CAsyncSocket是怎么实现的,我估计就算正常关闭,nErrorCode也不等于0,它把关闭当成一种错误了,也是可以理解的。

OnAccept, OnReceive,OnSend这些当然就不能有错误了,这是可理解的。
Feiyan_d 2012-09-21
  • 打赏
  • 举报
回复
刚看完《WinSock网络编程经络》,新出版的,正好回答你的问题,这本书的第312页写道:
“FD_CLOSE消息的错误码与其他消息有些差别,它不是批关闭发生了错误,而是表示对方是正常关闭还是放弃连接。错误码0,是正常关闭;为WSAECONNRESET,连接被重设,对方放弃了连接。”
根据书中描述可以知道,当对方给你发送RESET时,错误应该是非0,这时也要关闭socket,而不能不关,那样就有问题了。

18,356

社区成员

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

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