📄 subject_19507.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> CClientAsyncSocket();<BR> virtual ~CClientAsyncSocket();<BR><BR>// Overrides<BR>public:<BR> // ClassWizard generated virtual function overrides<BR> //{{AFX_VIRTUAL(CClientAsyncSocket)<BR> //}}AFX_VIRTUAL<BR><BR> // Generated message map functions<BR> //{{AFX_MSG(CClientAsyncSocket)<BR> // NOTE - the ClassWizard will add and remove member functions here.<BR> //}}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> CServerAsyncSocket();<BR> virtual ~CServerAsyncSocket();<BR><BR>// Overrides<BR>public:<BR> // ClassWizard generated virtual function overrides<BR> //{{AFX_VIRTUAL(CServerAsyncSocket)<BR> public:<BR> virtual void OnAccept(int nErrorCode);<BR> virtual void OnReceive(int nErrorCode);<BR> //}}AFX_VIRTUAL<BR><BR> // Generated message map functions<BR> //{{AFX_MSG(CServerAsyncSocket)<BR> // NOTE - the ClassWizard will add and remove member functions here.<BR> //}}AFX_MSG<BR><BR>// Implementation<BR>protected:<BR><BR>private:<BR> 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> //{{AFX_MSG_MAP(CServerAsyncSocket)<BR> //}}AFX_MSG_MAP<BR>END_MESSAGE_MAP()<BR>#endif // 0<BR><BR>/////////////////////////////////////////////////////////////////////////////<BR>// CServerAsyncSocket member functions<BR><BR>void CServerAsyncSocket::OnAccept(int nErrorCode) <BR>{<BR> // TODO: Add your specialized code here and/or call the base class<BR> if (nErrorCode == 0)<BR> {<BR> if (!Accept(m_sock))<BR> {<BR> DWORD dwErr = CAsyncSocket::GetLastError();<BR> <BR> return;<BR> }<BR> }<BR> <BR> CAsyncSocket::OnAccept(nErrorCode);<BR>}<BR><BR>void CServerAsyncSocket::OnReceive(int nErrorCode) <BR>{<BR> // TODO: Add your specialized code here and/or call the base class<BR> if (nErrorCode == 0)<BR> {<BR> char szBuf[CHAR_MAX];<BR> memset(szBuf, 0, sizeof(szBuf));<BR> int iLen = Receive(szBuf, sizeof(szBuf));<BR> if (!iLen )<BR> {<BR> DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR> return;<BR> }<BR> }<BR><BR> CAsyncSocket::OnReceive(nErrorCode);<BR>}<BR><BR><BR>工作流程如下:<BR>1.服务器端启动,侦听:<BR>private:<BR> CServerAsyncSocket CServerDlg::m_sServerSocket<BR><BR><BR>void CServerDlg::OnButtonListen() <BR>{<BR> // TODO: Add your control notification handler code here<BR> if (!m_sServerSocket.Create(4000))<BR> {<BR> DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR> return;<BR> }<BR><BR> if (!m_sServerSocket.Listen())<BR> {<BR> DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR> return;<BR> }<BR><BR> return;<BR>}<BR><BR>2.客户端发起连接:<BR><BR>private:<BR> CClientAsyncSocket CClientDlg::m_sClientSocket;<BR><BR>void CClientDlg::OnButtonConnect() <BR>{<BR> // TODO: Add your control notification handler code here<BR> if (!m_sClientSocket.Create())<BR> {<BR> DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR> return;<BR> }<BR><BR> if (!m_sClientSocket.Connect("127.0.0.1", 4000))<BR> {<BR> DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR> return;<BR> }<BR><BR> return;<BR>}<BR><BR>3.服务器端接受连接:<BR><BR>void CServerAsyncSocket::OnAccept(int nErrorCode) <BR>{<BR> // TODO: Add your specialized code here and/or call the base class<BR> if (nErrorCode == 0)<BR> {<BR> if (!Accept(m_sock))<BR> {<BR> DWORD dwErr = CAsyncSocket::GetLastError();<BR> <BR> return;<BR> }<BR> }<BR> <BR> CAsyncSocket::OnAccept(nErrorCode);<BR>}<BR><BR>4.客户端向服务器端发送数据:<BR><BR>void CClientDlg::OnButtonSend() <BR>{<BR> // TODO: Add your control notification handler code here<BR> char *pStr = "Hello, world!";<BR> int iLen = m_sClientSocket.Send(pStr, strlen(pStr));<BR> if (iLen == SOCKET_ERROR )<BR> {<BR> DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR> return;<BR> }<BR><BR> return;<BR>}<BR><BR>5.服务器端接收数据:<BR><BR>void CServerAsyncSocket::OnReceive(int nErrorCode) <BR>{<BR> // TODO: Add your specialized code here and/or call the base class<BR> if (nErrorCode == 0)<BR> {<BR> char szBuf[CHAR_MAX];<BR> memset(szBuf, 0, sizeof(szBuf));<BR> int iLen = Receive(szBuf, sizeof(szBuf));<BR> if (!iLen )<BR> {<BR> DWORD dwErr = CAsyncSocket::GetLastError();<BR><BR> return;<BR> }<BR> }<BR><BR> 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 + -