ACE的SOCKET通信:handle_input 函数的返回值不能随便写!
如果用ACE做两个SOCKET客户端(Client),并且重载handle_input函数,返回数值3。运行发现先触发handle_input的那个Client对象一直接收服务器数据正常;另一个Client对象在服务器发送数据时也不会触发handle_input。
如果把handle_input的返回值改为0后,两个Client对象就都能正常接收数据了。
代码:
#include "ace/Reactor.h"
#include "ace/SOCK_Connector.h"
#include <string>
#include <iostream>
using namespace std;
class CClient1:public ACE_Event_Handler
{
public:
bool open()
{
ACE_SOCK_Connector connector;
ACE_INET_Addr addr(60000,"127.0.0.1");
ACE_Time_Value timeout(5,0);
if(connector.connect(peer,addr,&timeout) != 0)
{
cout<<endl<<"connect fail.";
return false;
}
ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK);
cout<<endl<<"\nClient1 connected.";
strcpy(buf, "\nClient1:hello,Server.\n");
peer.send(buf,strlen(buf));
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(buf,sizeof(buf),&timeout))>0)
{
buf[rev]='\0';
cout<<endl<<"Client1 recv: "<<buf<<endl;
}
// 如果在下面返回数值3,会导致先触发handle_input的那个Client对象一直接收
// 服务器数据正常;其他的对象在服务器发送数据时也不会触发handle_input。
return 0; // return 3;
}
private:
ACE_SOCK_Stream peer;
char buf[100];
};
class CClient2:public ACE_Event_Handler
{
public:
bool open()
{
ACE_SOCK_Connector connector;
ACE_INET_Addr addr(60001,"127.0.0.1");
ACE_Time_Value timeout(5,0);
if(connector.connect(peer,addr,&timeout) != 0)
{
cout<<endl<<"connect fail.";
return false;
}
ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK);
cout<<endl<<"\nClient2 connected.";
strcpy(buf, "\nClient2:hello,Server.\n");
peer.send(buf,strlen(buf));
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(buf,sizeof(buf),&timeout))>0)
{
buf[rev]='\0';
cout<<endl<<"Client2 recv: "<<buf<<endl;
}
// 如果在下面返回数值3,会导致先触发handle_input的那个Client对象一直接收
// 服务器数据正常;其他的对象在服务器发送数据时也不会触发handle_input。
return 0; // return 3;
}
private:
ACE_SOCK_Stream peer;
char buf[100];
};
int main(int argc, char *argv[])
{
CClient1 client1;
CClient2 client2;
client1.open();
client2.open();
while(true)
{
ACE_Reactor::instance()->handle_events();
}
return 0;
}