100分ACE反应器的问题

malone1 2008-10-28 11:39:31
#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;
}

ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK);
cout<<endl<<"connecetd ";
char *a="caca";
peer.send(a,5);

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;
}

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



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


MyClient client;
client.open(addr);

MyClient client;
client.open(addr1);


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

return 0;
}


连接两个服务器端,为什么只接收到一条回复信息?能修改好的加50
...全文
133 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
太乙 2008-10-28
  • 打赏
  • 举报
回复
MyClient client;  
client.open(addr);

MyClient client;
client.open(addr1);

不能编译通过吧??俩名字冲了~!!
xhs_lh04 2008-10-28
  • 打赏
  • 举报
回复
handle_input 里要判断读返回,<=0要return -1让反应器回调close方法关闭连接,另增加handle_close()方法关闭连接,删除自身
暂时就这么多了

因为你只声明了一个client变量(虽然两次但只是同一个),所以反应器只注册了一个事件处理器
当然只能接收一条返回信息了
xhs_lh04 2008-10-28
  • 打赏
  • 举报
回复
int main(int argc, char *argv[])
{
ACE_INET_Addr addr1(3001,"127.0.0.1");
ACE_INET_Addr addr(3000,"127.0.0.1");


MyClient client;
client.open(addr);

MyClient client1;
client1.open(addr1);


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

return 0;
}
malone1 2008-10-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xhs_lh04 的回复:]
handle_input 里要判断读返回, <=0要return -1让反应器回调close方法关闭连接,另增加handle_close()方法关闭连接,删除自身
暂时就这么多了

因为你只声明了一个client变量(虽然两次但只是同一个),所以反应器只注册了一个事件处理器
当然只能接收一条返回信息了
[/Quote]
为什么声明两次却只注册了一个事件处理器?
malone1 2008-10-28
  • 打赏
  • 举报
回复
#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;
}

ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK);
cout<<endl<<"connecetd ";
char *a="caca";
peer.send(a,5);

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;
}

}

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



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


MyClient client1;
client1.open(addr1);

MyClient client2;
client2.open(addr2);


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

return 0;
}
谁能改好啊?好了马上给分,全部给。
星羽 2008-10-28
  • 打赏
  • 举报
回复
up
帅得不敢出门 2008-10-28
  • 打赏
  • 举报
回复
一个Myclient当做两个用了.

65,211

社区成员

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

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