当前位置:  技术问答>linux和unix

调用ACE_SSL_SOCK_Acceptor::accept函数的时候,进程死掉(在一个死循环中不断的调用accept,程序运行一段时间后,就会死掉)

    来源: 互联网  发布时间:2016-04-21

    本文导语:   ACE_SSL_SOCK_Acceptor twoway_acceptor; ACE_INET_Addr twoway_server_addr (port); if (twoway_acceptor.open (twoway_server_addr, 100) == -1) ACE_ERROR_RETURN ((LM_ERROR,"%pn","open"),1); else if (twoway_acceptor.get_local_addr(twoway_server_addr) == -1) ACE_ERROR_RETURN...

 ACE_SSL_SOCK_Acceptor twoway_acceptor;
ACE_INET_Addr twoway_server_addr (port);
if (twoway_acceptor.open (twoway_server_addr, 100) == -1)
ACE_ERROR_RETURN ((LM_ERROR,"%pn","open"),1);
else if (twoway_acceptor.get_local_addr(twoway_server_addr) == -1)
ACE_ERROR_RETURN ((LM_ERROR,"%pn","get_local_addr"),1);
ACE_Handle_Set handle_set;
handle_set.set_bit (twoway_acceptor.get_handle ());
for (;;) 
{
ACE_Time_Value timeout (ACE_DEFAULT_TIMEOUT);
ACE_Time_Value time_com(20,0);
ACE_Handle_Set temp = handle_set;
int result = ACE_OS::select (int (twoway_acceptor.get_handle ()) + 1,(fd_set *)       temp,0,0,&timeout);

if (result == -1) continue;
else if (result == 0 && verbose) continue;
else
{
if (temp.is_set (twoway_acceptor.get_handle ()))
{
ACE_SSL_SOCK_Stream* new_stream = new ACE_SSL_SOCK_Stream();
int r = twoway_acceptor.accept (*new_stream,0,&time_com,0); //程序到此处有时会死掉
if (r == -1)
{
new_stream->close();
delete new_stream;
continue;
}
ACE_INET_Addr remote_addr;
if (new_stream->get_remote_addr(remote_addr) == -1)
{
new_stream->close();
delete new_stream;
continue;
}
if (strcmp(remote_addr.get_host_addr(),m_ip))
{
new_stream->close();
delete new_stream;
//s_net.on_exp(EXP_WARNING,(string("manager ip address incorrect,but it has the manager certs, it ip is ")+remote_addr.get_host_addr()).c_str());
s_net.on_exp(EXP_WARNING,(string("管理IP不正确,但是对方有管理证书,对方IP是")+remote_addr.get_host_addr()).c_str());
_LOG("manager ip address incorrect,ignore");
continue;
}

pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
if (pthread_create(&tid,&attr,on_command,(void*)new_stream) != 0) 
{
new_stream->close();
delete new_stream;
//s_net.on_exp(EXP_ERROR,"create task error on new manager coming,can't process manager command now");
s_net.on_exp(EXP_ERROR,"管理任务创建失败,现在不能处理管理命令。");
_LOG("creat new task command thread faild!");
continue;
}
}
}

以上是代码,大体上是在一个死循环中连续不断的去accept连接请求,但是程序运行一段时间后就自动死掉,不知道什么原因。请大侠们指点啊。

|
代码好乱哦,
看起来是只要select成功以就new了一个ACE_SSL_SOCK_Stream;
但是你的程序中并没有保证所有new出来的ACE_SSL_SOCK_Stream都delete了

|
那你有没有做同步呢?
因为你子线程里要的是new_stream指向的地址,而你主线程可能很快的new了一个新的空间这样new_stream指向了一个新的地址。

|
你的on_command里面有没有把new_stream给释放掉的动作?

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • ioctl中能不能调用generic_file_read呀?我一调用就不动了 iis7站长之家
  • Linux添加系统调用时如何调用C语言库函数
  • sessionbean调用entitybean的时候还需要像Client一样远程调用对象吗??
  • system()调用 与 ioctl()调用
  • linux中为什么系统调用比普通函数调用更费时间?
  • 如何在LINUX下用一个普通文件调用一个自己编写的调用系统的文件
  • 可不可以用java调用其他语言的编译结果?(好象asp调用com那样)
  • 为什么我的BEAN 在WIN2000中调用没有问题,但在LINUX中调用有问题
  • 为什么守护进程调用调用getlogin会失败呢?
  • 用RMI进行远程对象调用的时候,可不可以实现多个调用远程对象的并发操作
  • 关于jsp调用javabean的问题!调用是成功了,但是有小问题!
  • ioctl中能不能调用generic_file_read呀?我一调用就不动了
  • LINUX下系统调用是不能中断的,要怎么改造成可以中断系统调用?
  • 请问用javaScript或vbScript可否调用页面上Applet的public函数?如何调用?
  • 请问在jsp中调用外部的类,与jsp调用javabean有何区别??
  • 调用数学函数,需要调用哪个函数库?
  • 调用system(“命令”)和函数调用之间有什么不同?效率?
  • 请问如何在Java中调用一个VB所写的DLL?如何调用这个Dll的方法?如何取得和设置这个Dll的属性值?谢谢!
  • 脚本1调用脚本2,脚本2必须输入回车,如何在调用过程中自动输入回车
  • 请问linux中的系统调用号是如何跟系统调用表对应起来的
  • 我的APPLET在Jbuilder5中,可以调用EJB对象,但是移植到网页上却不能调用EJB对象!是何缘故,值得研究!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3