300分ACE高手来拿(改好再加200)

malone1 2008-10-29 12:48:27
#include "stdafx.h"
#define _WIN32_WINNT 0x0510

#include <ace/OS.h>
#include <ace/Reactor.h>
#include <ace/SOCK_Connector.h>

#include <string>
#include <iostream>
using namespace std;
#pragma comment(lib,"aced.lib")


class MyClient:public ACE_Event_Handler
{
public:

bool open(ACE_INET_Addr addr)

{
ACE_SOCK_Connector connector;


ACE_Time_Value timeout(5,0);

if(connector.connect(peer,addr,&timeout) != 0)
{
cout<<endl<<"connecetd fail";
return false;
}
cout<<endl<<"connecetd ";
char *a="caca";
//一次发送
peer.send(a,5);
//两次发送
peer.send(a,5);


//注册读事件
ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK);



return true;
}

ACE_HANDLE get_handle(void) const
{
return peer.get_handle();
}

int handle_input (ACE_HANDLE fd)
{
int rev=0;
ACE_Time_Value timeout(5,0);
if((rev=peer.recv(buffer,1000,&timeout))>0)
{
buffer[rev]='\0';
cout<<endl<<"rev:\t"<<buffer<<endl;
return 3;
}
else
{
return -1;
}

}

virtual int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
{
if (this->peer.get_handle () == ACE_INVALID_HANDLE)
{

ACE_Reactor_Mask m = ACE_Event_Handler::DONT_CALL;
this->reactor ()->remove_handler (this, m);
this->peer.close ();

}
return 0;
}

private:
ACE_SOCK_Stream peer;
char buffer[1024];
};



int main(int argc, char *argv[])
{
ACE_INET_Addr addr1(3000,"127.0.0.1");
ACE_INET_Addr addr2(3001,"127.0.0.1");
ACE_INET_Addr addr3(3002,"127.0.0.1");


MyClient *client1 = new MyClient;

client1->reactor(ACE_Reactor::instance());




client1->open(addr1);


MyClient *client2 = new MyClient;

client2->reactor(client1->reactor());




client2->open(addr2);

MyClient *client3 = new MyClient;
client3->reactor(client1->reactor());



client3->open(addr3);


while(true)
{
ACE_Reactor::instance()->handle_events();
}

return 0;
}
连接三个服务器,发两次数据给各个服务器,为什么只能收到每个服务器一次的返回信息就阻塞掉了?
谁给改改,我要的效果是只有服务器主动关闭,客户端才不接受数据。
...全文
166 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lijuntao1027 2009-09-29
  • 打赏
  • 举报
回复
你可以用三个线程来驱动三个时间循环
太乙 2008-10-29
  • 打赏
  • 举报
回复
友情up~~
xhs_lh04 2008-10-29
  • 打赏
  • 举报
回复
virtual int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
{
if (this->peer.get_handle () == ACE_INVALID_HANDLE)
{

ACE_Reactor_Mask m = ACE_Event_Handler::DONT_CALL;
this->reactor ()->remove_handler (this, m);
this->peer.close ();

}
这里要改
virtual int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
{
this->peer.close ();
delete this;
}


另外
while(true)
{
ACE_Reactor::instance()->handle_events();
}
可以用
ACE_Reactor::instance()->run_reactor_event_loop();
代替,好看点,没别的
chaojiew 2008-10-29
  • 打赏
  • 举报
回复
ace啊,我还是飘过吧
xhs_lh04 2008-10-29
  • 打赏
  • 举报
回复
char *a="caca";
//一次发送
peer.send(a,5);
//两次发送
peer.send(a,5);
为啥发两次?


呵呵你还是给我发私信吧,这里顶贴太累
xhs_lh04 2008-10-29
  • 打赏
  • 举报
回复
晕我还是眼花了
MyClient *client1 = new MyClient;
呵呵那你必须
virtual int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
{
this->peer.close ();
delete this;
}
不然你的类没地方释放
xhs_lh04 2008-10-29
  • 打赏
  • 举报
回复
你的服务器会话是怎么定义的?

先连接收两次之后开始发送数据吗?
xhs_lh04 2008-10-29
  • 打赏
  • 举报
回复
因为在回调handle_input返回-1时反应器会自动移除事件处理器作remove_handle,此函数会回调你的handle_close,而你在close里再又调remove_handle就变成无限调用了
malone1 2008-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xhs_lh04 的回复:]
virtual int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
{
if (this->peer.get_handle () == ACE_INVALID_HANDLE)
{

ACE_Reactor_Mask m = ACE_Event_Handler::DONT_CALL;
this->reactor ()->remove_handler (this, m);
this->peer.close ();

}
这里要改
virtual int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
{
this->peer.close (…
[/Quote]
为什么接收到一条信息就关闭了。不能一直等待带服务器端的数据过来?
xhs_lh04 2008-10-29
  • 打赏
  • 举报
回复
错了,你不是new 的
virtual int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
{
this->peer.close ();
}
不能delete this

SORRY
镜机 2008-10-29
  • 打赏
  • 举报
回复
友情up~~

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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