⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_19507.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:19507 发表者:崔明亮 发表日期:2002-10-29 14:15:10
<br>主题:请问各位高手,为什么 void OnReceive(int nErrorCode) 没有执行?
<br>内容:我编了一个程序,利用CAsyncSocket的派生类实现TCP通讯。但不能执行void OnReceive(int nErrorCode),请各位高手指教<BR><BR>客户端:<BR><BR>// ClientAsyncSocket.h<BR>class CClientAsyncSocket : public CAsyncSocket<BR>{<BR>// Attributes<BR>public:<BR><BR>// Operations<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CClientAsyncSocket();<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CClientAsyncSocket();<BR><BR>// Overrides<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;// ClassWizard generated virtual function overrides<BR>&nbsp;&nbsp;&nbsp;&nbsp;//{{AFX_VIRTUAL(CClientAsyncSocket)<BR>&nbsp;&nbsp;&nbsp;&nbsp;//}}AFX_VIRTUAL<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Generated message map functions<BR>&nbsp;&nbsp;&nbsp;&nbsp;//{{AFX_MSG(CClientAsyncSocket)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// NOTE - the ClassWizard will add and remove member functions here.<BR>&nbsp;&nbsp;&nbsp;&nbsp;//}}AFX_MSG<BR><BR>// Implementation<BR>protected:<BR>};<BR><BR><BR>// ClientAsyncSocket.cpp<BR>CClientAsyncSocket::CClientAsyncSocket()<BR>{<BR>}<BR><BR>CClientAsyncSocket::~CClientAsyncSocket()<BR>{<BR>}<BR><BR><BR>服务器端:<BR><BR>// ServerAsyncSocket.h<BR>class CServerAsyncSocket : public CAsyncSocket<BR>{<BR>// Attributes<BR>public:<BR><BR>// Operations<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CServerAsyncSocket();<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CServerAsyncSocket();<BR><BR>// Overrides<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;// ClassWizard generated virtual function overrides<BR>&nbsp;&nbsp;&nbsp;&nbsp;//{{AFX_VIRTUAL(CServerAsyncSocket)<BR>&nbsp;&nbsp;&nbsp;&nbsp;public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual void OnAccept(int nErrorCode);<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual void OnReceive(int nErrorCode);<BR>&nbsp;&nbsp;&nbsp;&nbsp;//}}AFX_VIRTUAL<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Generated message map functions<BR>&nbsp;&nbsp;&nbsp;&nbsp;//{{AFX_MSG(CServerAsyncSocket)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// NOTE - the ClassWizard will add and remove member functions here.<BR>&nbsp;&nbsp;&nbsp;&nbsp;//}}AFX_MSG<BR><BR>// Implementation<BR>protected:<BR><BR>private:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CAsyncSocket m_sock;<BR><BR>};<BR><BR><BR>// ServerAsyncSocket.cpp<BR>CServerAsyncSocket::CServerAsyncSocket()<BR>{<BR>}<BR><BR>CServerAsyncSocket::~CServerAsyncSocket()<BR>{<BR>}<BR><BR><BR>// Do not edit the following lines, which are needed by ClassWizard.<BR>#if 0<BR>BEGIN_MESSAGE_MAP(CServerAsyncSocket, CAsyncSocket)<BR>&nbsp;&nbsp;&nbsp;&nbsp;//{{AFX_MSG_MAP(CServerAsyncSocket)<BR>&nbsp;&nbsp;&nbsp;&nbsp;//}}AFX_MSG_MAP<BR>END_MESSAGE_MAP()<BR>#endif&nbsp;&nbsp;&nbsp;&nbsp;// 0<BR><BR>/////////////////////////////////////////////////////////////////////////////<BR>// CServerAsyncSocket member functions<BR><BR>void CServerAsyncSocket::OnAccept(int nErrorCode) <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your specialized code here and/or call the base class<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nErrorCode == 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!Accept(m_sock))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwErr = CAsyncSocket::GetLastError();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CAsyncSocket::OnAccept(nErrorCode);<BR>}<BR><BR>void CServerAsyncSocket::OnReceive(int nErrorCode) <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your specialized code here and/or call the base class<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nErrorCode == 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szBuf[CHAR_MAX];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(szBuf, 0, sizeof(szBuf));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int iLen = Receive(szBuf, sizeof(szBuf));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!iLen )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;CAsyncSocket::OnReceive(nErrorCode);<BR>}<BR><BR><BR>工作流程如下:<BR>1.服务器端启动,侦听:<BR>private:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CServerAsyncSocket CServerDlg::m_sServerSocket<BR><BR><BR>void CServerDlg::OnButtonListen() <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your control notification handler code here<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!m_sServerSocket.Create(4000))<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!m_sServerSocket.Listen())<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>}<BR><BR>2.客户端发起连接:<BR><BR>private:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CClientAsyncSocket CClientDlg::m_sClientSocket;<BR><BR>void CClientDlg::OnButtonConnect() <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your control notification handler code here<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!m_sClientSocket.Create())<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!m_sClientSocket.Connect("127.0.0.1", 4000))<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>}<BR><BR>3.服务器端接受连接:<BR><BR>void CServerAsyncSocket::OnAccept(int nErrorCode) <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your specialized code here and/or call the base class<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nErrorCode == 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!Accept(m_sock))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwErr = CAsyncSocket::GetLastError();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CAsyncSocket::OnAccept(nErrorCode);<BR>}<BR><BR>4.客户端向服务器端发送数据:<BR><BR>void CClientDlg::OnButtonSend() <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your control notification handler code here<BR>&nbsp;&nbsp;&nbsp;&nbsp;char *pStr = "Hello, world!";<BR>&nbsp;&nbsp;&nbsp;&nbsp;int iLen = m_sClientSocket.Send(pStr, strlen(pStr));<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (iLen == SOCKET_ERROR )<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>}<BR><BR>5.服务器端接收数据:<BR><BR>void CServerAsyncSocket::OnReceive(int nErrorCode) <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your specialized code here and/or call the base class<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nErrorCode == 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szBuf[CHAR_MAX];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(szBuf, 0, sizeof(szBuf));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int iLen = Receive(szBuf, sizeof(szBuf));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!iLen )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;CAsyncSocket::OnReceive(nErrorCode);<BR>}<BR><BR>其中1-4运行正常,但第5步 void CServerAsyncSocket::OnReceive(int nErrorCode) 没有执行,请教各位大虾,这是什么原因?
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:阿蒙 回复日期:2002-10-29 15:37:26
<br>内容:用法好像不对。<BR>server端应该是:首先建立一个listen的socket和ReadWrite的Socket,在Listen的OnAccept里新建ReadWrite的类对象,Listen的继续监听。接收在ReadWrite的OnReceive函数里即可。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:中国娃娃 回复日期:2002-10-29 15:51:40
<br>内容:if (!Accept(m_sock))<BR>这句有问题。因为接受连接的m_sock是CAsyncSocket类型,而不是你所定义的CServerAsyncSocket类型,其实它是响应了OnReceive的,只不过调用的是CAsyncSocket::OnReceive而不是你的CServerAsyncSocket::OnReceive。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -