找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4488|回复: 10

奇怪的问题

[复制链接]
发表于 2009-7-7 13:47:46 | 显示全部楼层 |阅读模式
用ace reactor 写了服务器监听程序,开始用的是控制台应用程序,实现成功,没有问题。将此工程加以封装成服务程序,就不能够正常使用了。主程序一点没改过
有没有谁遇到过类似的问题呢。

[ 本帖最后由 jj601 于 2009-7-7 13:51 编辑 ]
发表于 2009-7-7 14:02:59 | 显示全部楼层
不能够正常使用,是怎么一个不能正常使用法呀?
具体描述一下,才好分析哦~
 楼主| 发表于 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 停了,但我没有过操作啊
发表于 2009-7-7 14:38:31 | 显示全部楼层
看你的意思是不是客户端发起连接,
服务器端无法接受并建立连接?
其次,你怎么确定ClientAcceptor::handle_input没有调用到的?
自己在handle_input函数入口打的日志或者打了断点没走到么?
还是估计的?

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

另,你怀疑event loop 停了,我看你在事件循环返回处打了日志了,
结果呢?你说的怀疑停了,是真停了么?还是没停呢?
 楼主| 发表于 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,然后换过多次,肯定不是端口号的问题
发表于 2009-7-7 15:03:05 | 显示全部楼层
换一个大于1024的端口试一下呗,
小于1023的一般都预留给系统使用了、、、
 楼主| 发表于 2009-7-7 15:03:57 | 显示全部楼层
我只是 举个列,试过很多端口了,日志监视listen success!

[ 本帖最后由 jj601 于 2009-7-7 15:08 编辑 ]
 楼主| 发表于 2009-7-7 15:04:18 | 显示全部楼层
还有就是,我在控制台程序跑是完全没有问题的
返回的是sock 连接失败,错误代码10061

[ 本帖最后由 jj601 于 2009-7-7 15:07 编辑 ]
发表于 2009-7-7 15:10:21 | 显示全部楼层
查一下10061是什么具体错误
netstat看下服务器有没有在listen
发表于 2009-7-7 15:13:19 | 显示全部楼层
把防火墙关了试一下。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-23 03:33 , Processed in 0.016386 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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