peakzhang 发表于 2007-12-18 23:57:27

ACE_Svc_Handler的类中向已连接的客户端发送消息的问题

研究ACE时间不长,正在刚开始体验就卡壳了,恳请各位有经验的前辈给予指点,多谢~!
在这里我没有完全的贴出代码,主要是怕多了反而说不到点子上,所以只贴出关键代码.
我的问题是继承了ACE_Svc_Handler的类中SVC()函数中我希望向已经连接了(我知道已经连接成功的原因是这个类的hanle_input函数可能确实收到客户端的消息)的用户发送消息,却不成功,不知道为什么,我在ACE程序员教程中也见过完全类似的应用.
最主要的就是这个继承了ACE_Svc_Handler的类,这个类管理着用户的连接,我可以正确的接受用户发送来的消息,但是却不能给用户发数据,下面我用&&&&&&&&&&&&指出问题的地方

class Jabber_Session
: public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> {
protected:
//ACE_FILE_IO log_file_; // File of log records.
// Connection to peer service handler.
//Jabber_Session logging_handler_;
public:
int recv_msg (ACE_Message_Block *&mblk);
virtual int open (void *);
virtual int svc (void);
virtual int handle_input (ACE_HANDLE handle);
virtual int handle_close
    (ACE_HANDLE = ACE_INVALID_HANDLE,
   ACE_Reactor_Mask = ACE_Event_Handler::ALL_EVENTS_MASK);
//接收发送的消息
virtual int put (ACE_Message_Block *mblk,
                   ACE_Time_Value *timeout = 0)
{ return putq (mblk, timeout); }
};

////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
int Jabber_Session::svc (void) {
ACE_DEBUG((LM_DEBUG, "into Jabber_Session->svc\n"));
while(1)
for (ACE_Message_Block *log_blk; getq (log_blk) != -1; ) {
ACE_DEBUG((LM_DEBUG, "Jabber_Session senda msg!\n"));
//循环,不停从队列中获取消息块,并且发用户
//ACE_DEBUG((LM_DEBUG, "peer state is ::%s\n", peer()->));
int result = 9;
// char * msg = log_blk->rd_ptr();
// if(result=peer().send_n(log_blk) == -1)
char * msg = "server msg to client\n";
    ACE_DEBUG((LM_DEBUG, "msg::%s",msg));
if(result=peer().send_n(msg,ACE_OS::strlen(msg)) == -1)
    ACE_DEBUG((LM_DEBUG, "Jabber_Session send error!"));
&&&&&&&&&&&&&&&&&&&&&&&不论我是想把log_blk作为参数send_n给对端,还是用一个常量字符串,发送的&&&&&&&&&&&&&&&&&&&&&&&result都是0,这是不是说没有成功?为什么呢?
ACE_DEBUG((LM_DEBUG, "Jabber_Session send result = %d\n",result));
log_blk->release ();
   }
//ACE_DEBUG((LM_DEBUG, "got msg over\n"));
return 0;
}
下面是这个类的全部定义代码,供参考:
int Jabber_Session::open (void *) {
ACE_DEBUG((LM_DEBUG, "one user has connected\n"));
reactor()->register_handler(this, ACE_Event_Handler::READ_MASK);
return activate (THR_NEW_LWP | THR_DAEMON);
}
int Jabber_Session::svc (void) {
ACE_DEBUG((LM_DEBUG, "into Jabber_Session->svc\n"));
while(1)
for (ACE_Message_Block *log_blk; getq (log_blk) != -1; ) {
ACE_DEBUG((LM_DEBUG, "Jabber_Session senda msg!\n"));
//循环,不停从队列中获取消息块,并且发给每个用户
//ACE_DEBUG((LM_DEBUG, "peer state is ::%s\n", peer()->));
int result = 9;
// char * msg = log_blk->rd_ptr();
// if(result=peer().send_n(log_blk) == -1)
char * msg = "server msg to client\n";
    ACE_DEBUG((LM_DEBUG, "msg::%s",msg));
if(result=peer().send_n(msg,ACE_OS::strlen(msg)) == -1)
    ACE_DEBUG((LM_DEBUG, "Jabber_Session send error!"));
ACE_DEBUG((LM_DEBUG, "Jabber_Session send result = %d\n",result));
log_blk->release ();
   }
//ACE_DEBUG((LM_DEBUG, "got msg over\n"));
return 0;
}

int Jabber_Session::handle_input (ACE_HANDLE h) {
//接收消息,然后放进一个mblk中,然后把mblk放到Msg_Switcher的队列中
ACE_DEBUG((LM_DEBUG, "%Igot one user's massage\n"));
ACE_Message_Block *mblk = 0;
if (recv_msg (mblk) == -1)
{
ACE_DEBUG((LM_INFO,"recv_msg error or client disconnect!\n"));
    return -1;
}
else
{
   ACE_DEBUG((LM_INFO,"put msg into switcher\n"));
   if(MSG_SWITCHER_HANDLER::instance()->put(mblk)==-1){
mblk->release();
return -1;
   }
return 0;
}
}
int Jabber_Session::handle_close (ACE_HANDLE h,
                                        ACE_Reactor_Mask mask) {
ACE_DEBUG((LM_DEBUG,"%IJabberSession handle_close!\n"));
MSG_SWITCHER_HANDLER::instance()->remove_jabber_session(this);
delete this;
return 0;
}

int Jabber_Session::recv_msg (ACE_Message_Block *&mblk)
{
// Align the Message Block for a CDR stream
size_t result = -1;
char buff;
result = peer().recv(buff,1024);
if(result == -1)return -1;
// cout<<"客户端: ";
ACE_DEBUG((LM_DEBUG,"%I客户端::"));
for(int i=0;i<result;i++)
ACE_DEBUG((LM_DEBUG,"%c",buff));
ACE_DEBUG((LM_DEBUG,"%I\n"));
// cout<<buff;
// cout<<endl;

//ACE_DEBUG((LM_DEBUG,"recv_msg buff = %s\n",iov.iov_base));
ACE_NEW_RETURN(mblk,
      ACE_Message_Block(i),
      -1);
mblk->copy(buff,i);
    return result;
}

peakzhang 发表于 2007-12-18 23:57:44

是我犯了低级错误,这儿发送数据其实是成功了,错误出在我的客户端.

可以使用send_n()的第三个参数,这个参数才是说明成功的发送了多少个字节,而函数的返回值只是说明发送成功与否?-1表示失败,而0应该是成功.

多谢flowstar.

结帖.
页: [1]
查看完整版本: ACE_Svc_Handler的类中向已连接的客户端发送消息的问题