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