找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6063|回复: 6

ACE_Asynch_Acceptor动态open,cancel问题---新

[复制链接]
发表于 2012-7-4 22:11:00 | 显示全部楼层 |阅读模式
本帖最后由 独来读网 于 2012-7-5 18:22 编辑

自己断点跟进去看了一下,
1)通过delete*时,析构函数中调用了操作系统的ACE_OS::closesocket (this->listen_handle_);进而调用了::closesocket ((SOCKET) handle).
2)而使用cancel时,内部调用了::CancelIo (this->listen_handle_).
     关闭了当前连接器上的输入输出,但此连接器还是存在的,因为没有调用::closesocket ((SOCKET) handle).

为什么Acceptor里面没有::closesocket ((SOCKET) handle)的调用呢?
忘有人帮我说明一下.

//--------------------------------------------------------------------

我在一个类里声明了一个ACE_Asynch_Acceptor对象 m_Accppt
先调用open(),打开对指定的端口的监听,监听打开成功
然后调用cancel(),取消这个端口的监听.

之后再调用open(),打开对同样端口的监听时,出现了错误,断点执行
发现
  // Bind to the specified port.
  if (ACE_OS::bind (this->listen_handle_,
                    reinterpret_cast<sockaddr *> (address.get_addr ()),
                    address.get_size ()) == -1)
    {
      ACE_Errno_Guard g (errno);
      ACE_ERROR ((LM_ERROR,
                  ACE_TEXT ("%p\n"),
                  ACE_TEXT ("ACE_OS::bind")));
      ACE_OS::closesocket (this->listen_handle_);
      this->listen_handle_ = ACE_INVALID_HANDLE;
      return -1;
    }
出错了,其中errno=10048.
不知道出什么错误.


发表于 2012-7-4 23:13:10 | 显示全部楼层
10048 - address already in use
在绑定监听端口的时候,加个reuse参数即可。这是tcp特有的。

virtual int open (const ACE_INET_Addr &address,
                    size_t bytes_to_read = 0,
                    bool pass_addresses = false,
                    int backlog = ACE_DEFAULT_ASYNCH_BACKLOG,
                    int reuse_addr = 1, ///这里
                    ACE_Proactor *proactor = 0,
                    bool validate_new_connection = false,
                    int reissue_accept = 1,
                    int number_of_initial_accepts = -1);
 楼主| 发表于 2012-7-5 06:05:06 | 显示全部楼层
winston 发表于 2012-7-4 23:13
10048 - address already in use
在绑定监听端口的时候,加个reuse参数即可。这是tcp特有的。

是不是把reuse_addr参数传进去0,在cancel就可以正常停止了?
 楼主| 发表于 2012-7-5 07:00:10 | 显示全部楼层
winston 发表于 2012-7-4 23:13
10048 - address already in use
在绑定监听端口的时候,加个reuse参数即可。这是tcp特有的。

能否给我一个能正常结束的accept.
我试过用了,好像设置为0也没有用.
但用new accept
delete accept却可以使用.
发表于 2012-7-5 07:21:08 | 显示全部楼层
int reuse_addr = 1,就已经是地址重用了。

我感觉你是属于那种“先上手、再看书”的类型,但ACE系统还是有些复杂度的,建议先看一下书,哪怕有个大概印象,用到再去查不迟。否则你会碰到无穷无尽的这些小问题,而大概看完书就很少再会碰见这些。
 楼主| 发表于 2012-7-5 09:50:19 | 显示全部楼层
winston 发表于 2012-7-5 07:21
int reuse_addr = 1,就已经是地址重用了。

我感觉你是属于那种“先上手、再看书”的类型,但ACE系统还是 ...

嗯,高手,一下就知道我是先上手的.
 楼主| 发表于 2012-7-5 16:01:48 | 显示全部楼层
自己断点跟进去看了一下,
1)通过delete*时,析构函数中调用了操作系统的ACE_OS::closesocket (this->listen_handle_);进而调用了::closesocket ((SOCKET) handle).
2)而使用cancel时,内部调用了::CancelIo (this->listen_handle_).
     关闭了当前连接器上的输入输出,但此连接器还是存在的,因为没有调用::closesocket ((SOCKET) handle).

为什么Acceptor里面没有::closesocket ((SOCKET) handle)的调用呢?
忘有人帮我说明一下.
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-5-1 23:12 , Processed in 0.021383 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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