找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4040|回复: 1

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

[复制链接]
发表于 2007-12-18 23:57:27 | 显示全部楼层 |阅读模式
研究ACE时间不长,正在刚开始体验就卡壳了,恳请各位有经验的前辈给予指点,多谢~!
在这里我没有完全的贴出代码,主要是怕多了反而说不到点子上,所以只贴出关键代码.
我的问题是继承了ACE_Svc_Handler的类中SVC()函数中我希望向已经连接了(我知道已经连接成功的原因是这个类的hanle_input函数可能确实收到客户端的消息)的用户发送消息,却不成功,不知道为什么,我在ACE程序员教程中也见过完全类似的应用.
最主要的就是这个继承了ACE_Svc_Handler的类,这个类管理着用户的连接,我可以正确的接受用户发送来的消息,但是却不能给用户发数据,下面我用&&&&&&&&&&&&指出问题的地方
  1. class Jabber_Session
  2.   : public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> {
  3. protected:
  4. //  ACE_FILE_IO log_file_; // File of log records.
  5.   // Connection to peer service handler.
  6.   //Jabber_Session logging_handler_;
  7. public:
  8.   int recv_msg (ACE_Message_Block *&mblk);
  9.   virtual int open (void *);
  10.   virtual int svc (void);
  11.   virtual int handle_input (ACE_HANDLE handle);
  12.   virtual int handle_close
  13.     (ACE_HANDLE = ACE_INVALID_HANDLE,
  14.      ACE_Reactor_Mask = ACE_Event_Handler::ALL_EVENTS_MASK);
  15.   //接收发送的消息
  16.   virtual int put (ACE_Message_Block *mblk,
  17.                    ACE_Time_Value *timeout = 0)
  18.   { return putq (mblk, timeout); }
  19. };
  20. ////////////////////////////////////////////////////////////////////////////////////
  21. ////////////////////////////////////////////////////////////////////////////////////
  22. int Jabber_Session::svc (void) {
  23.   ACE_DEBUG((LM_DEBUG, "into Jabber_Session->svc\n"));
  24.   while(1)
  25.   for (ACE_Message_Block *log_blk; getq (log_blk) != -1; ) {
  26. ACE_DEBUG((LM_DEBUG, "Jabber_Session send  a msg!\n"));
  27. //循环,不停从队列中获取消息块,并且发用户
  28. //ACE_DEBUG((LM_DEBUG, "peer state is ::%s\n", peer()->));
  29. int result = 9;
  30. // char * msg = log_blk->rd_ptr();
  31. // if(result=peer().send_n(log_blk) == -1)
  32. char * msg = "server msg to client\n";
  33.     ACE_DEBUG((LM_DEBUG, "msg::%s",msg));
  34. if(result=peer().send_n(msg,ACE_OS::strlen(msg)) == -1)
  35.     ACE_DEBUG((LM_DEBUG, "Jabber_Session send error!"));
  36. &&&&&&&&&&&&&&&&&&&&&&&不论我是想把log_blk作为参数send_n给对端,还是用一个常量字符串,发送的&&&&&&&&&&&&&&&&&&&&&&&result都是0,这是不是说没有成功?为什么呢?
  37. ACE_DEBUG((LM_DEBUG, "Jabber_Session send result = %d\n",result));
  38. log_blk->release ();
  39.    }
  40. //ACE_DEBUG((LM_DEBUG, "got msg over\n"));
  41. return 0;
  42. }
  43. 下面是这个类的全部定义代码,供参考:
  44. int Jabber_Session::open (void *) {
  45. ACE_DEBUG((LM_DEBUG, "one user has connected\n"));
  46. reactor()->register_handler(this, ACE_Event_Handler::READ_MASK);
  47. return activate (THR_NEW_LWP | THR_DAEMON);
  48. }
  49. int Jabber_Session::svc (void) {
  50.   ACE_DEBUG((LM_DEBUG, "into Jabber_Session->svc\n"));
  51.   while(1)
  52.   for (ACE_Message_Block *log_blk; getq (log_blk) != -1; ) {
  53. ACE_DEBUG((LM_DEBUG, "Jabber_Session send  a msg!\n"));
  54. //循环,不停从队列中获取消息块,并且发给每个用户
  55. //ACE_DEBUG((LM_DEBUG, "peer state is ::%s\n", peer()->));
  56. int result = 9;
  57. // char * msg = log_blk->rd_ptr();
  58. // if(result=peer().send_n(log_blk) == -1)
  59. char * msg = "server msg to client\n";
  60.     ACE_DEBUG((LM_DEBUG, "msg::%s",msg));
  61. if(result=peer().send_n(msg,ACE_OS::strlen(msg)) == -1)
  62.     ACE_DEBUG((LM_DEBUG, "Jabber_Session send error!"));
  63. ACE_DEBUG((LM_DEBUG, "Jabber_Session send result = %d\n",result));
  64. log_blk->release ();
  65.    }
  66. //ACE_DEBUG((LM_DEBUG, "got msg over\n"));
  67. return 0;
  68. }
  69. int Jabber_Session::handle_input (ACE_HANDLE h) {
  70.   //接收消息,然后放进一个mblk中,然后把mblk放到Msg_Switcher的队列中
  71.   ACE_DEBUG((LM_DEBUG, "%Igot one user's massage\n"));
  72.   ACE_Message_Block *mblk = 0;
  73.   if (recv_msg (mblk) == -1)
  74.   {
  75. ACE_DEBUG((LM_INFO,"recv_msg error or client disconnect!\n"));
  76.     return -1;
  77.   }
  78.   else
  79.   {
  80.    ACE_DEBUG((LM_INFO,"put msg into switcher\n"));
  81.    if(MSG_SWITCHER_HANDLER::instance()->put(mblk)==-1){
  82.   mblk->release();
  83.   return -1;
  84.    }
  85.   return 0;
  86.   }
  87. }
  88. int Jabber_Session::handle_close (ACE_HANDLE h,
  89.                                         ACE_Reactor_Mask mask) {
  90.   ACE_DEBUG((LM_DEBUG,"%IJabberSession handle_close!\n"));
  91.   MSG_SWITCHER_HANDLER::instance()->remove_jabber_session(this);
  92.   delete this;
  93.   return 0;
  94. }
  95.   int Jabber_Session::recv_msg (ACE_Message_Block *&mblk)
  96. {
  97.   // Align the Message Block for a CDR stream
  98. size_t result = -1;
  99. char buff[1024];
  100. result = peer().recv(buff,1024);
  101. if(result == -1)return -1;
  102. // cout<<"客户端: ";
  103. ACE_DEBUG((LM_DEBUG,"%I客户端::"));
  104. for(int i=0;i<result;i++)
  105.   ACE_DEBUG((LM_DEBUG,"%c",buff[i]));
  106. ACE_DEBUG((LM_DEBUG,"%I\n"));
  107. // cout<<buff[i];
  108. // cout<<endl;
  109. //ACE_DEBUG((LM_DEBUG,"recv_msg buff = %s\n",iov[0].iov_base));
  110. ACE_NEW_RETURN(mblk,
  111.       ACE_Message_Block(i),
  112.       -1);
  113. mblk->copy(buff,i);
  114.     return result;
  115. }
复制代码
 楼主| 发表于 2007-12-18 23:57:44 | 显示全部楼层
是我犯了低级错误,这儿发送数据其实是成功了,错误出在我的客户端.

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

多谢flowstar.

结帖.
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2025-3-12 14:57 , Processed in 0.038326 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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