关于CAsyncSocket::OnReceive的问题

古沐风 2011-02-24 05:33:40
我是socket新手。未测试用法,故编了最简单的客户-服务器程序。现在做了两个对话框程序,一个客户端仅负责发送数据;一个服务器负责接收数据。二者均继承与CAsyncSocket,且都在dlg类里面声明了对象。目前客户端发送数据没问题,可是服务器这边有问题,即发送数据后不响应OnReceive()函数。
症状:客户端连接服务器时,服务器端能够响应OnAccept,同时客户端发送信息,服务器Accept之后立即receive()能够接到数据。但是之后客户端再次单击send之后,服务器这端却不能响应OnReceive()。目前百思不得其解。
下面附下代码吧:


/////////////////////////////////////////////////////////////////////////////
// CTcpSocket member functions

void CTcpSocket::OnAccept(int nErrorCode)
{
// 此处能够进入,证明连接没问题。
::MessageBox(NULL,"准许请求,连接","提示",MB_ICONINFORMATION);
Accept(cltSocket);

CAsyncSocket::OnAccept(nErrorCode);
}


void CTcpSocket::OnReceive(int nErrorCode)
{
// 此函数无法得到响应,即不能进入。
::MessageBox(NULL,"接到信息"," ",MB_ICONINFORMATION);

char buf[100+1];
cltSocket.Receive(buf,100,0);
::MessageBox(NULL,buf,"提示",MB_ICONINFORMATION);
CAsyncSocket::OnReceive(nErrorCode);
}

//////////////////////////////////////////////////
///////////////服务器对话框/////////////////////

//此处侦听正常
void CServerDlg::OnListen()
{
// TODO: Add your control notification handler code here
int port = 8000;

if( false == (srvSocket.Create(port)) )
{
::MessageBox(NULL,"无法建立服务器!","错误",MB_ICONINFORMATION);
srvSocket.Close();
}
else
{
if (!srvSocket.Listen())
{
::MessageBox(NULL,"无法侦听客户端!","错误",MB_ICONINFORMATION);
}
else
{
::MessageBox(NULL,"侦听中....","提示",MB_ICONINFORMATION);
}
}
}


...全文
338 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Autumn_Gao 2011-08-19
  • 打赏
  • 举报
回复
如何解决的?
古沐风 2011-02-25
  • 打赏
  • 举报
回复
问题已解决...3KS
古沐风 2011-02-24
  • 打赏
  • 举报
回复
试了,没用。
[Quote=引用 1 楼 bragi523 的回复:]
读完一次之后用AsyncSelect置为FD_READ试试
[/Quote]
bragi523 2011-02-24
  • 打赏
  • 举报
回复
读完一次之后用AsyncSelect置为FD_READ试试
环境:Windows XP SP 3、 VC++ 6.0、 Windows Server 2003 SDK 使用步骤: 1、下载解压之后,使用VC++ 6.0 IDE打开.dws文件 2、点击“!”按钮运行程序 3、如果一切正常会出现一个对话框,然后选择下拉框中的“服务端”启动服务器进程--接着点击“监听”按钮 4、然后再点击“!”按钮运行客户端进程 5、如果一切正常,那么选择下拉框中的“客户端”启动客户端进程--接着点击“连接”按钮,让客户端连接到socket服务器 6、在客户端的“消息”栏中输入信息,然后点击“发送”按钮 7、点击服务器端进程,应该可以看见客户端发送过来的消息,然后可以在“消息”栏中输入响应信息,然后点击“发送”按钮,此时会在客户端进程中看服务器端进程响应的信息 该示例是实现了一个客户端对象对应一个服务端对象的socket的网络编程--最简单的VC++的网络编程示例。该示使用主要是自定义一个类--它继承MFC库中CAsyncSocket类,然后重写OnAccept, OnSend, OnReceive和OnClose方法来实现一对一的VC++的socket网络编程。注意:自定义类关联应用向导生成的对话框类,需要在头文件中书写语句“class CHelloSocketDlg;”,并且在.cpp文件中写入语句“#include "HelloSocketDlg.h";”,否则编译不会通过! 本示例使用Dialog模式的UI是为方便说明socket编程,在对话框类的OnInitDialog方法有初始化的成员变量的注释说明,在自定义类中的注释非常详细。本人觉得MFC使用异步通信类CAsyncSocket实现Java中的ServerSocket类和Socket类的编程效果,是非常牛的!(虽然本人认为它还封装得不够OO--因为它封装得让使用者觉得“很傻很天真”)。

18,355

社区成员

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

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