找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5734|回复: 10

ACE_Message_Block的问题

[复制链接]
发表于 2009-8-25 14:42:34 | 显示全部楼层 |阅读模式
ACE程序员 第7章  P141
int Client::handle_output(ACE_HANDLE)
{

ACE_Message_Block *mb;
ACE_Time_Value nowait (ACE_OS::gettimeofday());
while (-1 != this->getq (mb, &nowait))
{
  ssize_t send_cnt = this->peer().send (mb->rd_ptr(),mb->length());
  if(send_cnt == -1)
   ACE_ERROR((LM_ERROR,
              ACE_TEXT("%p\n"),
                 ACE_TEXT("send")));
  else
   mb->rd_ptr(ACE_static_cast (ssize_t, send_cnt));
  if (mb->length () > 0)
  {
   this->ungetq (mb);
   break;
  }
  mb->release();
}
if(this->msg_queue()->is_empty())
  this->reactor()->cancel_wakeup(this, ACE_Event_Handler::WRITE_MASK);
else
  this->reactor()->schedule_wakeup(this, ACE_Event_Handler::WRITE_MASK);
  
  
return 0;
}
如何把ACE_Message_Block *mb初始化来把数据从客户端发送给服务器
ACE_Message_Block *mb = new ACE_Message_Block (30);
     ACE_OS::sprintf(mb->wr_ptr(),"%s","hello");

或者
char buffer[100];
     ACE_Message_Block *mb = new ACE_Message_Block (buffer,30);

都不行
 楼主| 发表于 2009-8-25 14:55:45 | 显示全部楼层

回复 #1 psycheqiqi 的帖子

有人没?........
发表于 2009-8-25 15:03:30 | 显示全部楼层
ACE_Message_Block是ACE非常常用的一个类,
建议花一点时间看一下他的头文件声明。
另外C++NPV1有专门的章节讲他的用法,
强烈建议楼主先看书。
 楼主| 发表于 2009-8-25 15:29:06 | 显示全部楼层

回复 #3 modern 的帖子

看不明白
还是不知道在哪发数据
 楼主| 发表于 2009-8-25 15:32:59 | 显示全部楼层

回复 #3 modern 的帖子

这是客户端的代码
#include "Client.h"
//#pragma comment(lib,"ws2_32")
int Client::open (void *p)
{
        ACE_Time_Value iter_delay (2);
        if (super::open(p) == -1)
                return -1;
        this->notifier_.reactor (this->reactor());
        this->msg_queue ()->notification_strategy(&this->notifier_);
        return this->reactor()->schedule_timer(this, 0, ACE_Time_Value::zero, iter_delay);
}

int Client::handle_input (ACE_HANDLE)
{
        char buf[64];
        ssize_t recv_cnt = this->peer().recv (buf,sizeof(buf)-1);
        write(1,buf,recv_cnt);//客户端收到信息的显示
        if(recv_cnt > 0)
        {
                ACE_DEBUG ((LM_DEBUG,
                                ACE_TEXT("%*C"),
                                        ACE_static_cast (int, recv_cnt),
                                        buf));
                return 0;
        }
        if (recv_cnt == 0 || ACE_OS::last_error() != EWOULDBLOCK)
        {
                this->reactor()->end_reactor_event_loop();
                return -1;
        }
        return 0;
}

int Client::handle_timeout(const ACE_Time_Value &, const void *)
{
        if (this->iterations_>=ITERATIONS)
        {
                this->peer().close_writer();
                return 0;
        }
        ACE_Message_Block *mb;
        char msg[128];
        ACE_OS::sprintf (msg, "Iteration %d\n", this->iterations_);
        ACE_NEW_RETURN (mb, ACE_Message_Block (msg), -1);
        this->putq(mb);
        return 0;
}

int Client::handle_output(ACE_HANDLE)
{


        ACE_Message_Block *mb = new ACE_Message_Block (30);
        ACE_OS::sprintf(mb->wr_ptr(),"%s","hello world");

        ACE_Time_Value nowait (ACE_OS::gettimeofday());
        while (-1 != this->getq (mb, &nowait))
        {
                ssize_t send_cnt = this->peer().send (mb->rd_ptr(),mb->length());
                if(send_cnt == -1)
                        ACE_ERROR((LM_ERROR,
                                   ACE_TEXT("%p\n"),
                               ACE_TEXT("send")));
                else
                        mb->rd_ptr(ACE_static_cast (ssize_t, send_cnt));
                if (mb->length () > 0)
                {
                        this->ungetq (mb);
                        break;
                }
                mb->release();
        }

        if(this->msg_queue()->is_empty())
                this->reactor()->cancel_wakeup(this, ACE_Event_Handler::WRITE_MASK);
        else
                this->reactor()->schedule_wakeup(this, ACE_Event_Handler::WRITE_MASK);
               
       
        return 0;

}


int ACE_TMAIN(int, ACE_TCHAR *[])
{
        ACE_INET_Addr port_to_connect ("HAStatus",ACE_LOCALHOST);
        ACE_Connector<Client,ACE_SOCK_CONNECTOR> connector;
        Client client;
        Client *pc = &client;
        if(connector.connect(pc,port_to_connect) == -1)
                ACE_ERROR_RETURN((LM_ERROR,
                              ACE_TEXT ("%p\n"),
                                                  ACE_TEXT ("connect")),1);
       
        ACE_Reactor::instance()->run_reactor_event_loop();
        return(0);
}
 楼主| 发表于 2009-8-25 15:33:50 | 显示全部楼层

回复 #3 modern 的帖子

这是服务器的
#include "ClientService.h"
#include "ace/Reactor.h"

int ClientService::open(void *p)
{
        if(super::open(p) == -1)
                return -1;

    const int MAXHOSTNAMELEN=32;
        ACE_TCHAR peer_name[MAXHOSTNAMELEN];
        ACE_INET_Addr peer_addr;

//        if(this->sock_.get_remote_addr(peer_addr)==0 &&
        if(this->peer().get_remote_addr(peer_addr)==0 &&
                peer_addr.addr_to_string(peer_name,MAXHOSTNAMELEN)==0)
                ACE_DEBUG ((LM_DEBUG,
                            ACE_TEXT("Connection from %s\n"),
                                        peer_name));
        return 0;
//        return this->reactor()->register_handler(this,ACE_Event_Handler::READ_MASK);
}

int ClientService::handle_input(ACE_HANDLE)
{
        const size_t INPUT_SIZE =4096;
        char buffer[INPUT_SIZE];
        SSIZE_T recv_cnt,send_cnt;

//        if((recv_cnt = this->sock_.recv(buffer,sizeof(buffer)))<=0)
        if((recv_cnt = this->peer().recv(buffer,sizeof(buffer)))<=0)
        {
                ACE_DEBUG((LM_DEBUG,
                               ACE_TEXT("Connection closed\n")));
                return -1;
        }

//        write(1,buffer,recv_cnt);//服务器收到信息显示
//        send_cnt = this->sock_.send(buffer,ACE_static_cast(size_t,recv_cnt));
        send_cnt = this->peer().send(buffer,ACE_static_cast(size_t,recv_cnt));
        if(send_cnt == recv_cnt)
                return 0;
    if(send_cnt==-1 && ACE_OS::last_error()!=EWOULDBLOCK)
                ACE_ERROR_RETURN((LM_ERROR,
                                  ACE_TEXT("%p\n"),
                                                  ACE_TEXT("send")),
                                                  0);
        if(send_cnt==-1)
                send_cnt=0;
        ACE_Message_Block *mb;
        size_t remaining = ACE_static_cast(size_t,(recv_cnt - send_cnt));
    ACE_NEW_RETURN(mb,ACE_Message_Block(&buffer[send_cnt],remaining),-1);

        int output_off=this->msg_queue()->is_empty();

        ACE_Time_Value nowait(ACE_OS::gettimeofday());

        if(this->putq(mb, &nowait) == -1)
        {
                ACE_ERROR((LM_ERROR,
                               ACE_TEXT("%p; discarding data\n"),
                                   ACE_TEXT("enqueue failed")));
                mb->release();
                return 0;
        }
        if(output_off)
                return this->reactor()->register_handler(this,ACE_Event_Handler::WRITE_MASK);
        return 0;
}

int ClientService::handle_output(ACE_HANDLE)
{
       

        ACE_Message_Block *mb = new ACE_Message_Block (30);
        ACE_OS::sprintf(mb->wr_ptr(),"%s","hello");


        ACE_Time_Value nowait(ACE_OS::gettimeofday());
        while (-1 != this->getq (mb, &nowait))
        {
                ssize_t send_cnt = this->peer().send (mb->rd_ptr(),mb->length());
                if(send_cnt == -1)
                        ACE_ERROR((LM_ERROR,
                                   ACE_TEXT("%p\n"),
                                           ACE_TEXT("send")));
                else
                        mb->rd_ptr(ACE_static_cast (ssize_t, send_cnt));
                if (mb->length () > 0)
                {
                        this->ungetq (mb);
                        break;
                }
                mb->release();
        }
        return (this->msg_queue()->is_empty())? -1 : 0;
}

int ClientService::handle_close (ACE_HANDLE h, 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();
        this->output_queue_.flush();
        delete this;
        return 0;
*/
        return super::handle_close(h, mask);
}
 楼主| 发表于 2009-8-25 15:35:21 | 显示全部楼层

回复 #3 modern 的帖子

就是input和output两个函数的message_block不明白
如何写入客户端或者服务器给对方要发送的信息
发表于 2009-8-25 20:15:52 | 显示全部楼层
我觉得,你最好先了解一下C++网络编程卷1中,对ACE_Message_Block的描述。
4.2节
发表于 2009-8-25 20:16:00 | 显示全部楼层
4.2 The ACE_Message_Block ClassMotivationMany networked applications require a means to manipulate messages efficiently . Standard message management operations include
  • Storing messages in buffers as they are received from the network or from other processes on the same host
  • Adding and/or removing headers and trailers from messages as they pass through a user-level protocol stack
  • Fragmenting and reassembling messages to fit into network maximum transmission units (MTUs)
  • Storing messages in buffers for transmission or retransmission
  • Reordering messages that were received out-of-sequence
发表于 2009-8-25 20:17:18 | 显示全部楼层
看完了,我相信不用讲,你也明白how to do it 了。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-26 06:11 , Processed in 0.020688 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表