jj601 发表于 2009-7-7 13:47:46

奇怪的问题

用ace reactor 写了服务器监听程序,开始用的是控制台应用程序,实现成功,没有问题。将此工程加以封装成服务程序,就不能够正常使用了。主程序一点没改过
有没有谁遇到过类似的问题呢。

[ 本帖最后由 jj601 于 2009-7-7 13:51 编辑 ]

modern 发表于 2009-7-7 14:02:59

不能够正常使用,是怎么一个不能正常使用法呀?
具体描述一下,才好分析哦~

jj601 发表于 2009-7-7 14:11:44

ACE_INET_Addr addr_to_listen(global.listenport, ACE_LOCALHOST);
    ClientAcceptor acceptor;
    acceptor.reactor(ACE_Reactor::instance());
    //开始监听,向反应器进行登记,请求它在可以接受新连接时回调自己。
    if (acceptor.open(addr_to_listen) == -1)
        {
               CString str;
   //获取系统时间
   CTime tm;
   tm=CTime::GetCurrentTime();
   str=tm.Format("%Y年%m月%d日%X");
       str=str+"listen failed!"+"\r\n";
                fwrite(str,1,strlen(str),pFile);
                        fflush(pFile);
                return ;
        }
        else
        {
               CString str;
               CTime tm;
      tm=CTime::GetCurrentTime();
      str=tm.Format("%Y年%m月%d日%X");
          str=str+"listen success!"+"\r\n";
                fwrite(str,1,strlen(str),pFile);
                fflush(pFile);
               

        }
此步正确
t=ACE_Reactor::instance()->run_reactor_event_loop();
        if(t<0)
        {
               CString str;
               CTime tm;
      tm=CTime::GetCurrentTime();
      str=tm.Format("%Y年%m月%d日%X");
          str=str+"反应器事件循环失败"+"\r\n";
                fwrite(str,1,strlen(str),pFile);
                fflush(pFile);
        }
        else
        {
                CString str;
               CTime tm;
      tm=CTime::GetCurrentTime();
      str=tm.Format("%Y年%m月%d日%X");
                CString s;
                s.Format("%d",t);
   
      fwrite(s,1,strlen(s),pFile);
                fwrite(str,1,strlen(str),pFile);
   
                fflush(pFile);
       

        }
此步无返回值
int ClientAcceptor::handle_input(ACE_HANDLE fd)
{}
发起链接时,根本没有进来handle-input
怀疑是event loop 停了,但我没有过操作啊

modern 发表于 2009-7-7 14:38:31

看你的意思是不是客户端发起连接,
服务器端无法接受并建立连接?
其次,你怎么确定ClientAcceptor::handle_input没有调用到的?
自己在handle_input函数入口打的日志或者打了断点没走到么?
还是估计的?

handle_input这个函数是由连接从对端到达时,框架自动调用的。
如果这一步都没有走到的话,
说明select或者waitformultiobject干脆就没有检查到I/O描述符的变化。
那比较可能是与程序无关的一些低级错误产生的,
比如,端口号指定错了。

另,你怀疑event loop 停了,我看你在事件循环返回处打了日志了,
结果呢?你说的怀疑停了,是真停了么?还是没停呢?

jj601 发表于 2009-7-7 14:51:39

我只是怀疑哈,日志没有记录,主要想不出怎么会没到handle_input
,自己觉得太奇怪了
int ClientAcceptor::handle_input(ACE_HANDLE fd)
    {
                fprintf(pFile,"进入handle input");
      
      ClientService *client = new ClientService();   

      if (this->acceptor_.accept(client->peer()) == -1)
                {fprintf(pFile,"acceptpr_.accept等于-1");
                   return -1;
                }
                else
                {
      fprintf(pFile,"acceptpr_.accept done");
                }
      //p.release();
      client->reactor(this->reactor());
      if (client->open() == -1)
                {
                        fprintf(pFile,"client open == -1");
            client->handle_close(ACE_INVALID_HANDLE, 0);
                }
                else
                {
         fprintf(pFile,"client open true");
                }

没有进入到handle input,端口号我用的6,然后换过多次,肯定不是端口号的问题

modern 发表于 2009-7-7 15:03:05

换一个大于1024的端口试一下呗,
小于1023的一般都预留给系统使用了、、、

jj601 发表于 2009-7-7 15:03:57

我只是 举个列,试过很多端口了,日志监视listen success!

[ 本帖最后由 jj601 于 2009-7-7 15:08 编辑 ]

jj601 发表于 2009-7-7 15:04:18

还有就是,我在控制台程序跑是完全没有问题的
返回的是sock 连接失败,错误代码10061

[ 本帖最后由 jj601 于 2009-7-7 15:07 编辑 ]

wishel 发表于 2009-7-7 15:10:21

查一下10061是什么具体错误
netstat看下服务器有没有在listen

modern 发表于 2009-7-7 15:13:19

把防火墙关了试一下。
页: [1] 2
查看完整版本: 奇怪的问题