独来读网 发表于 2012-7-4 22:11:00

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

本帖最后由 独来读网 于 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.
不知道出什么错误.


winston 发表于 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 static/image/common/back.gif
10048 - address already in use
在绑定监听端口的时候,加个reuse参数即可。这是tcp特有的。



是不是把reuse_addr参数传进去0,在cancel就可以正常停止了?

独来读网 发表于 2012-7-5 07:00:10

winston 发表于 2012-7-4 23:13 static/image/common/back.gif
10048 - address already in use
在绑定监听端口的时候,加个reuse参数即可。这是tcp特有的。



能否给我一个能正常结束的accept.
我试过用了,好像设置为0也没有用.
但用new accept
delete accept却可以使用.

winston 发表于 2012-7-5 07:21:08

int reuse_addr = 1,就已经是地址重用了。

我感觉你是属于那种“先上手、再看书”的类型,但ACE系统还是有些复杂度的,建议先看一下书,哪怕有个大概印象,用到再去查不迟。否则你会碰到无穷无尽的这些小问题,而大概看完书就很少再会碰见这些。

独来读网 发表于 2012-7-5 09:50:19

winston 发表于 2012-7-5 07:21 static/image/common/back.gif
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)的调用呢?
忘有人帮我说明一下.
页: [1]
查看完整版本: ACE_Asynch_Acceptor动态open,cancel问题---新