boring98 发表于 2010-7-8 15:56:31

如何判断ACE_Asynch_Connector连接有效性?

想构造一个连接池,里面存放ACE_Asynch_Connector派生类MY_Connector对象的指针。
连接池的初始化用如下方法循环100次,若不为NULL则插入连接池:addr_为服务器的地址和端口。

        MY_Connector *p_tmp = new MY_Connector();
        if(-1 != p_tmp->open())
        {
                if(-1 != p_tmp->connect(addr_))
                {
                        return p_tmp;
                }
                else
                {
                        delete p_tmp;
                        return NULL;
                }
        }
        else
        {
                delete p_tmp;
                return NULL;
        }

每次程序都显示100个不为NULL的MY_Connector指针成功放入连接池,但用netstat察看网络连接状况,发现实际建立的连接只有7、80个。

而MY_Connector类也写了有效性判断:
int MY_Connector::validate_connection(
                                                                   const ACE_Asynch_Connect::Result& result
                                                                   , const ACE_INET_Addr &remote
                                                                   , const ACE_INET_Addr& local)
{
        if (!result.success())
        {
                ACE_DEBUG((LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("validate_connection")));
                return -1;
        }
        else
        {
                return 0;
        }
}

问一下各位牛人,如何判断连接的有效性?我的程序问题出在何处?

另外,用Wireshark察看网络通讯情况发现失败的连接除了建立连接的三次握手之外,服务器都有RST消息返回。

boring98 发表于 2010-7-9 16:26:16

回复 #1 boring98 的帖子

解决了。方法是:
for循环中,每次建立连接之后Sleep(10)

为啥需要Sleep呢?服务器端应付不过来?求牛人解释,谢谢!

yoogera 发表于 2010-7-9 22:57:16

关注~~~~~~~~~~~~

steven99ca 发表于 2010-7-15 00:22:16

1.
一般而言,单一线程中的sleep永远都是错的。
呵呵。
2.
既然是异步方式,一定是通过handle_whatever来确认的。你的代码显然不对。

modern 发表于 2010-7-15 08:57:56

可以尝试修改一下linsten函数的backlog参数的大小,
对于Asyn_Accptor的open函数恰好已经将这个参数暴露了出来。

dwh0403 发表于 2010-7-15 09:22:29

1.
一般而言,单一线程中的sleep永远都是错的。
呵呵。
2.
既然是异步方式,一定是通过handle_whatever来确 ...
steven99ca 发表于 2010-7-15 00:22 http://www.acejoy.com/bbs/images/common/back.gif


:victory:
页: [1]
查看完整版本: 如何判断ACE_Asynch_Connector连接有效性?