关于ace中ACE_Event_Handler中handle_input的一点疑惑...

allen_zhaozhencn 2005-03-31 03:05:47
以下是CFileEventHandler类的handle_input代码: 接收文件内容。

int CClientEventHandler::handle_input(ACE_HANDLE fd)
{

reactor()->suspend_handler(this);

char buf[1024] = {0};
int iFactRecvBytes = 0;
int iCompleteBytes = 0;
int iTotalBytes = 0;
int iSectionBytes = 1024;

struct FILE_INFO
{
char name[MAX_PATH]; //文件名称
int length; //文件长度(字节数)
}m_FileInfo;

std::ofstream file(".\\desc.txt", std::ios_base::trunc);

m_ClientStream.recv(buf, sizeof(FILE_INFO) ); //接收文件相关信息结构体

memcpy(&m_FileInfo, buf, sizeof(FILE_INFO) );

printf("Received File Name is: %s, size bytes is: %d\n", m_FileInfo.name, m_FileInfo.length);

printf("File context is below:\n");

iTotalBytes = m_FileInfo.length;


for (; iCompleteBytes<iTotalBytes; iCompleteBytes += iFactRecvBytes)
{
if (iTotalBytes - iCompleteBytes < iSectionBytes)
{
iFactRecvBytes = m_ClientStream.recv(buf, iTotalBytes - iCompleteBytes);
}
else
{
iFactRecvBytes = m_ClientStream.recv(buf, iSectionBytes);
}


/*
iFactRecvBytes = m_ClientStream.recv(buf, iSectionBytes);
*/
file.write(buf, iFactRecvBytes);

std::cout << buf;

}

file.close( );

reactor()->resume_handler(this);

return 0;
}

经调试,可以收到客户端发过来的数据,但是,在运行时,程序好像根本无法中止,终始不断地显示所收到的内容。我想了好久,handle_input是在当套按字上有数据接收时调用的,如果正在执行该函数时(刚读取完套接字的数据,此时套接字又发送数据过来),handle_input函数应该会重入执行。 所以,为了避免这个问题,我在该函数的一开始就挂起了事件处理: reactor()->suspend_handler(this); 在接收完毕后, reactor()->resume_handler(this); 但是,为什么程序不能正确运行,请各位看看。
...全文
777 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
allen_zhaozhencn 2005-06-05
  • 打赏
  • 举报
回复
谢谢各位.
flashboy 2005-05-16
  • 打赏
  • 举报
回复
奇怪,怎么一有人讨论ACE的问题,就会有人来问是不是马维达,我都看过好几次这样的情况了,晕死了
ydogg 2005-05-08
  • 打赏
  • 举报
回复
1)
reactor()->suspend_handler(this);
reactor()->resume_handler(this);
这些可以去掉,input函数没有返回,Reactor不会理会这些设置的

2)
// m_ClientStream.recv(buf, sizeof(FILE_INFO) ); //接收文件相关信息结构体
为什么没有判断连接断开的情况,如果连接断开了,input函数没有返回-1,则Reactor会反复不停的调用input函数

3)
记得每次都用清空你的FILE_INFO结构

4)最后,写文件这末耗时的应用应该放到后台线程去做
fisker0303 2005-04-04
  • 打赏
  • 举报
回复
检查一下需要长时间循环的代码、变量初始化的代码、内存copy容易造成内存溢出的代码。
allen_zhaozhencn 2005-04-04
  • 打赏
  • 举报
回复
qwertasdfg123 2005-04-01
  • 打赏
  • 举报
回复
在运行时,程序根本无法中止,终始不断地显示所收到的内容。 更奇怪的是,调试时居然可以顺利结束程序。


//////////////////////////////////////////
不知道你的发送程序是如何做的?收到的内容是不是有重复的?
allen_zhaozhencn 2005-04-01
  • 打赏
  • 举报
回复
晕,不是。
mostneed 2005-04-01
  • 打赏
  • 举报
回复
楼主是马维达?
allen_zhaozhencn 2005-04-01
  • 打赏
  • 举报
回复
在调式的时候,可以正常终止
allen_zhaozhencn 2005-04-01
  • 打赏
  • 举报
回复
发送程序是没有问题的,读文件并发送文件数据过来,在调试时,都可以获得这些数据。

oyljerry 2005-04-01
  • 打赏
  • 举报
回复
运行时,接收设置一个判断中止条件
wshcdr 2005-03-31
  • 打赏
  • 举报
回复
在调式的时候,可以正常终止么?
allen_zhaozhencn 2005-03-31
  • 打赏
  • 举报
回复
在运行时,程序根本无法中止,终始不断地显示所收到的内容。 更奇怪的是,调试时居然可以顺利结束程序。
goodheartppl 2005-03-31
  • 打赏
  • 举报
回复
出什么错
allen_zhaozhencn 2005-03-31
  • 打赏
  • 举报
回复
肯请各位熟悉ace的朋友看看, 分不够可以再加!

18,356

社区成员

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

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