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.
不知道出什么错误.
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); winston 发表于 2012-7-4 23:13 static/image/common/back.gif
10048 - address already in use
在绑定监听端口的时候,加个reuse参数即可。这是tcp特有的。
是不是把reuse_addr参数传进去0,在cancel就可以正常停止了? winston 发表于 2012-7-4 23:13 static/image/common/back.gif
10048 - address already in use
在绑定监听端口的时候,加个reuse参数即可。这是tcp特有的。
能否给我一个能正常结束的accept.
我试过用了,好像设置为0也没有用.
但用new accept
delete accept却可以使用. int reuse_addr = 1,就已经是地址重用了。
我感觉你是属于那种“先上手、再看书”的类型,但ACE系统还是有些复杂度的,建议先看一下书,哪怕有个大概印象,用到再去查不迟。否则你会碰到无穷无尽的这些小问题,而大概看完书就很少再会碰见这些。
winston 发表于 2012-7-5 07:21 static/image/common/back.gif
int reuse_addr = 1,就已经是地址重用了。
我感觉你是属于那种“先上手、再看书”的类型,但ACE系统还是 ...
嗯,高手,一下就知道我是先上手的. 自己断点跟进去看了一下,
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]