|  | 
 
| 大家好,有关ACE_Event_Handler的问题,需要请教大家。源代码和问题如下: 服务端代码:
 客户端代码:复制代码#include "stdafx.h"#include <ace/OS.h>#include <ace/Reactor.h>#include <ace/SOCK_Connector.h>#include <ace/SOCK_Acceptor.h>#include <ace/Auto_Ptr.h>#include <iostream>#pragma comment(lib, "ace.lib")#pragma comment(lib, "aced.lib")class ClientService : public ACE_Event_Handler{public:    ACE_SOCK_Stream &peer (void) { return this->sock_; }    int open (void)    {        //注册读就绪回调函数        return this->reactor ()->register_handler(this, ACE_Event_Handler::READ_MASK);    }    virtual ACE_HANDLE get_handle (void) const { return this->sock_.get_handle (); }    virtual int handle_input (ACE_HANDLE fd )    {        //一个简单的EchoServer,将客户端的信息返回        int rev = peer().recv(buf,100);        if(rev<=0)            return -1;        buf[rev]='\0';        std::cout<<"Receive from client:"<<buf<<std::endl;        peer().send(buf,rev);        std::cout<<"Send to client:"<<buf<<std::endl;        return 0;    }    // 释放相应资源    virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask mask)    {        if (mask == ACE_Event_Handler::WRITE_MASK)            return 0;        mask = ACE_Event_Handler::ALL_EVENTS_MASK |            ACE_Event_Handler::DONT_CALL;        this->reactor ()->remove_handler (this, mask);        this->sock_.close ();        delete this;    //socket出错时,将自动删除该客户端,释放相应资源        return 0;    }protected:    char buf[100];    ACE_SOCK_Stream sock_;};class ClientAcceptor : public ACE_Event_Handler{public:    virtual ~ClientAcceptor (){this->handle_close (ACE_INVALID_HANDLE, 0);}    int open (const ACE_INET_Addr &listen_addr)    {        if (this->acceptor_.open (listen_addr, 1) == -1)        {            ACE_OS::printf("open port fail");            return -1;        }        //注册接受连接回调事件        return this->reactor ()->register_handler(this, ACE_Event_Handler::ACCEPT_MASK);    }    virtual ACE_HANDLE get_handle (void) const    { return this->acceptor_.get_handle (); }    virtual int handle_input (ACE_HANDLE fd )    {        ClientService *client = new ClientService();        auto_ptr<ClientService> p (client);        if (this->acceptor_.accept (client->peer ()) == -1)        {            ACE_OS::printf("accept client fail \n");            return -1;        }        p.release ();        client->reactor (this->reactor ());        if (client->open () == -1)            client->handle_close (ACE_INVALID_HANDLE, 0);        return 0;    }    virtual int handle_close (ACE_HANDLE handle,        ACE_Reactor_Mask close_mask)    {        if (this->acceptor_.get_handle () != ACE_INVALID_HANDLE)        {            ACE_Reactor_Mask m = ACE_Event_Handler::ACCEPT_MASK |                ACE_Event_Handler::DONT_CALL;            this->reactor ()->remove_handler (this, m);            this->acceptor_.close ();        }        return 0;    }protected:    ACE_SOCK_Acceptor acceptor_;};int main(int argc, char *argv[]){    ACE_INET_Addr addr(3000,"127.0.0.1");    ClientAcceptor server;    server.reactor(ACE_Reactor::instance());    server.open(addr);    while(true)    {        ACE_Reactor::instance()->handle_events();    }    return 0;}
请问:复制代码#include "stdafx.h"#include <iostream>#include <string>#include <ace/ACE.h>#include <ace/INET_Addr.h>#include <ace/SOCK_Connector.h>#include <ace/SOCK_Stream.h>#pragma comment(lib, "ace.lib")#pragma comment(lib, "aced.lib")int _tmain(int argc, _TCHAR* argv[]){    ACE::init();    std::string str="Hello Server \n";    ACE_INET_Addr svr_addr(3000, "127.0.0.1");    ACE_SOCK_STREAM stream;    ACE_SOCK_Connector connector;    int ret=connector.connect(stream, svr_addr);    if(0 != ret)    {        std::cout<<"Error in connect"<<std::endl;        return -1;    }    std::cout<<"sending data:"<<std::endl<<str<<std::endl;    ret=stream.send(str.c_str(), str.length());    if(-1 == ret)    {        std::cout<<"Error in send"<<std::endl;        return -1;    }    str.erase();    str.resize(1024);    ret=stream.recv((void *)str.c_str(), str.length());    if(-1 == ret)    {        std::cout<<"Error in recv"<<std::endl;        return -1;    }    std::cout<<"recived data::"<<std::endl<<str<<std::endl;    ACE::fini();    return 0;}
客户端socket只发送了一次数据给服务端,但是为什么ClientService的handle_input会执行两次呢?
 谢谢大家!
 | 
 |