ACE的SOCKET通信:handle_input 函数的返回值不能随便写!

74 篇文章 0 订阅
57 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值