奇怪的问题
用ace reactor 写了服务器监听程序,开始用的是控制台应用程序,实现成功,没有问题。将此工程加以封装成服务程序,就不能够正常使用了。主程序一点没改过有没有谁遇到过类似的问题呢。
[ 本帖最后由 jj601 于 2009-7-7 13:51 编辑 ] 不能够正常使用,是怎么一个不能正常使用法呀?
具体描述一下,才好分析哦~ 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 停了,但我没有过操作啊 看你的意思是不是客户端发起连接,
服务器端无法接受并建立连接?
其次,你怎么确定ClientAcceptor::handle_input没有调用到的?
自己在handle_input函数入口打的日志或者打了断点没走到么?
还是估计的?
handle_input这个函数是由连接从对端到达时,框架自动调用的。
如果这一步都没有走到的话,
说明select或者waitformultiobject干脆就没有检查到I/O描述符的变化。
那比较可能是与程序无关的一些低级错误产生的,
比如,端口号指定错了。
另,你怀疑event loop 停了,我看你在事件循环返回处打了日志了,
结果呢?你说的怀疑停了,是真停了么?还是没停呢? 我只是怀疑哈,日志没有记录,主要想不出怎么会没到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,然后换过多次,肯定不是端口号的问题 换一个大于1024的端口试一下呗,
小于1023的一般都预留给系统使用了、、、 我只是 举个列,试过很多端口了,日志监视listen success!
[ 本帖最后由 jj601 于 2009-7-7 15:08 编辑 ] 还有就是,我在控制台程序跑是完全没有问题的
返回的是sock 连接失败,错误代码10061
[ 本帖最后由 jj601 于 2009-7-7 15:07 编辑 ] 查一下10061是什么具体错误
netstat看下服务器有没有在listen 把防火墙关了试一下。
页:
[1]
2