****** ace 下的 ACE_SOCK_Acceptor 拒绝服务,过一段时间后又提供服务,不知道什么原因????

hzhxxx 2006-08-17 04:59:08
//服务器段
int mian(int argc,char *argv[]){
ACE_SOCK_Acceptor acceptor_;
ACE_INET_Addr server_addr;
server_addr.set(9999,"");
acceptor_.open(server_addr,1);

for(;;)
{
ACE_INET_Addr logging_peer_addr;
if(acceptor().accept(logging_handler_.peer(),&logging_peer_addr) == -1)
{
ACE_ERROR_RETURN((LM_ERROR,"%p\n","accept()"),1);
}


ACE_SOCK_Acceptor 进行压力测试,看能顶住多少连接,我开一个客户端, 跑了 3 分钟都没有ACE_SOCK_Acceptor 就拒绝接受外面的连接了,把所有客户端停下,等 几分钟后,又可以提供服务了,也就是 accept 能成功了,很是郁闷,难道 ace 这么脆弱吗????


ACE_DEBUG((LM_DEBUG,"Accepted connection from %s\n",logging_peer_addr.get_host_name()));

logging_handler_.peer().close();
}
}

//客户端
int main(int argc,char * argv[])
{
ACE_INET_Addr server_addr;
server_addr.set(9999,"");
for(;;)
{
ACE_SOCK_Connector connector;
ACE_SOCK_Stream logging_peer_;
if(connector.connect(logging_peer_,server_addr) < 0 )
{
//ACE_ERROR_RETURN((LM_ERROR,"%p\n","connect()"),1);
ACE_DEBUG((LM_ERROR,"connect %s fail\n",logger_host),1);
ACE_OS::sleep(ACE_Time_Value(30,0));
continue;
}
}
}

...全文
460 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzhxxx 2006-11-20
  • 打赏
  • 举报
回复

这个不是好办法啊...
acejoy 2006-09-07
  • 打赏
  • 举报
回复
我尝试分析一下,未必全对啊,大家一起思考。
这不是ACE的问题,是你使用上欠考虑。
第一,你的ACE_SOCK_Acceptor 打开的时候,默认的后备队列只有5,
int open (const ACE_Addr &local_sap, int reuse_addr=0, int protocol_family=PF_UNSPEC, int backlog=ACE_DEFAULT_BACKLOG, int protocol=0)
ACE_DEFAULT_BACKLOG 默认是5,在Unix网络编程里面,关于这个值的含义,有详细的阐述。最主要的就是,这个值依赖于系统的实现,其实有所差别,但是它含义是已经连接的socket + 等待队列中的socket,而不仅仅是后者的数量。所以,我建议你加大这个数值,比如200,试试看。
第二,ACE用面向对象的方法封装了OS的各种API,后面其实还是这些,你必须懂这些API,才能更好的利用ACE发挥能力。比如,如果你要求大量的网络连接,可以使用异步的acceptor,在windows下面是AcceptEx,效能很高!
第三,ACE绝不脆弱,相信2000多高手的的智慧吧。

──────────────────────
国内专业的ACE论坛开通:
www.acejoy.com
www.acedevelop.com
涉及ACE使用和开发,服务器端软件的设计,P2P技术,
网络编程等内容。
欢迎加入,大家一起交流、学习成长!

hzhxxx 2006-09-07
  • 打赏
  • 举报
回复


在一台机器上同时运行客户端和服务器有这个问题,两台机器分别运行就没有了,很是郁闷
acejoy 2006-09-07
  • 打赏
  • 举报
回复
200并不大,很普通了,你看看windows网络编程里面的代码就知道了。unix网络编程里面的说明不过是说了当你取各种数值的时候,系统内核如何对待的。
hzhxxx 2006-08-24
  • 打赏
  • 举报
回复

int iret = 1;
//bool bDontLinger = true;
if(logging_handler_.peer ().set_option (SOL_SOCKET, SO_DONTLINGER, &iret,sizeof(int)) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("(%t) %p\n"),
ACE_TEXT ("Synch_Receiver::open ")
ACE_TEXT ("set_option SO_LINGER")),
-1);

设置了 SOL_SOCKET ,准备粗暴关闭 socket ,还是没有成功,一样进入了 time_out 状态
hzhxxx 2006-08-23
  • 打赏
  • 举报
回复


这个应该不应该啊,我就是直接使用 ::accept 也应该没有这样的问题啊
hzhxxx 2006-08-22
  • 打赏
  • 举报
回复

SeekTruth(鹤舞白沙) ( ) 信誉:101

我心飞翔


这个是程序的一部分功能,我简化出来了,现在修改后能彻底编译通过


//服务器段
#include "ace/sock_acceptor.h"
int main(int argc,char *argv[])
{
ACE_SOCK_Acceptor acceptor_;
ACE_INET_Addr server_addr;
server_addr.set(9999,"");
acceptor_.open(server_addr,1);

for(;;)
{
ACE_INET_Addr logging_peer_addr;
ACE_SOCK_Stream logging_handler_;
if(acceptor_.accept(logging_handler_,&logging_peer_addr) == -1)
{
ACE_ERROR_RETURN((LM_ERROR,"%p\n","accept()"),1);
}

//ACE_SOCK_Acceptor 进行压力测试,看能顶住多少连接,我开一个客户端, 跑了 3 分钟都没有ACE_SOCK_Acceptor 就拒绝接受外面的连接了,把所有客户端停下,等 几分钟后,又可以提供服务了,也就是 accept 能成功了,很是郁闷,难道 ace 这么脆弱吗????

ACE_DEBUG((LM_DEBUG,"Accepted connection from %s\n",logging_peer_addr.get_host_name()));

logging_handler_.close();
}
}


//客户端
#include "ace/os.h"
#include "ace/sock_connector.h"
int main(int argc,char * argv[])
{
ACE_INET_Addr server_addr;
server_addr.set(9999,"localhost");
for(;;)
{
ACE_SOCK_Connector connector;
ACE_SOCK_Stream logging_peer_;
if(connector.connect(logging_peer_,server_addr) < 0 )
{
ACE_DEBUG((LM_ERROR,"connect %s fail\n",server_addr.get_host_name()),1);
ACE_OS::sleep(ACE_Time_Value(30,0));
continue;
}
logging_peer_.close();
}
}

使用

netstat -a 查看,9999 端口上由很多 time_OUT 的连接,不知道是不是 close 失败了..



SeekTruth 2006-08-22
  • 打赏
  • 举报
回复
要管理大量客户端,用这个: ACE_Proactor
SeekTruth 2006-08-21
  • 打赏
  • 举报
回复
你程序通得过编译?

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧