|
研究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 send a 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 send a 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[1024];
- 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[i]));
- ACE_DEBUG((LM_DEBUG,"%I\n"));
- // cout<<buff[i];
- // cout<<endl;
- //ACE_DEBUG((LM_DEBUG,"recv_msg buff = %s\n",iov[0].iov_base));
- ACE_NEW_RETURN(mblk,
- ACE_Message_Block(i),
- -1);
- mblk->copy(buff,i);
- return result;
- }
复制代码 |
|