Jekin 发表于 2009-5-21 15:31:23

ACE_OS::closesocket(this->handle())无法关闭套接字

我使用的MFC的多文档视图+Proactor框架,
每个视图里面都打开一个ACE_Task线程,都创建一个新的proactor (proactor_ = new ACE_Proactor();),给这个线程里的异步IO类使用,
在线程里,建立一个Asynch_Connector,事件处理器是Service_Handler.

我给ACE_Task类加了一个stop函数,
void WL_ServerTask::stop(void)
{
proactor_->proactor_end_event_loop();
}
一旦调用这个函数,svc函数里就会把connector关闭销毁,
int WL_CA_ServerTask::svc(void)
{
................
..................
proactor_->proactor_run_event_loop();
if (as_connector_ != NULL)
{
as_connector_->cancel();
delete as_connector_;
as_connector_= NULL;
}
return 0;
}
connector销毁时,会把曾用它作为连接器的所有事件处理器Service_Handler也关闭,

问题是,客户端这边的事件处理器Service_Handler,在它销毁时,确实调用了
ACE_OS::closesocket(this->handle());
handle(ACE_INVALID_HANDLE);
(Debug跟踪的,肯定调用了这一句)
可是与服务器端的连接还存在,未断开,
只有在整个客户端程序全部关闭时,与服务器端的连接才断开,

:( 大家有没有看出问题出在哪啊?


另外如果那个proactor不自行创建,而是使用ACE_Proactor::instance()就能正常关闭了,
但是会有问题: 一个视图调用了stop函数,其他的视图会把连接都停止;

求助求助

Jekin 发表于 2009-5-21 16:34:02

而且使用自行创建的proactor_
proactor_= new ACE_Proactor(),
........
proactor_->proactor_run_event_loop();
好像整个框架根本就没运行起来,消息发送不出


proactor_= ACE_Proactor::instance();
........
proactor_->proactor_run_event_loop();
这个是正常的,消息能发送出去


大家帮忙想个:每个ACE_Task线程单独使用一个proactor框架,他们之间互不影响?

winston 发表于 2009-5-21 16:58:18

很疑惑,我没看明白你的问题是什么。。。汗啊。。。

Jekin 发表于 2009-5-21 19:13:58

我好像是没说明白:L ,我再解释解释.

现在我准备开多个线程,每个线程之间相互独立的,
1: 线程函数如下:
int WL_CA_ServerTask::svc(void)
{
as_connector_ = new WL_AS_Connector(pMFCWnd_,proactor_);
as_connector_->open();
int errorno = as_connector_->connect(as_addr_);

proactor_->proactor_run_event_loop();

return 0;
}

WL_AS_Connector是继承至ACE_Asynch_Connector的类,as_connector_是它的一个对象;
as_addr_是ACE_INET_Addr对象;
proactor是ACE_Proactor对象;

2: 另外我还要使MFC主线程能够关闭这些线程,所以又提供了一个stop函数:
void WL_CA_ServerTask::stop(void)
{
proactor_->proactor_end_event_loop();
}

现在按照proactor_实现有三种路径:
1>原先Proactor框架一般使用的都是ACE_Proactor:instance(), proactor_为指向它的一个指针,
问题出来了,一旦一个线程调用了stop函数,其他线程都停止了,因为都指向了一个proactor;

2>所以我打算每个线程都建立自己的ACE_Proactor:proactor_ = new ACE_Proactor();,但是按照这样建立的框架,好像根本就没运作起来:能建立网络连接,但是好像发送不了消息,异步完成事件都没发生.
PS:这个线程里面的connnector\handler,我都指定了使用proactor_作为它的前摄器.

3> ACE_WIN32_Proactor* winImp = new ACE_WIN32_Proactor;
proactor_ =new ACE_Proactor(winImp ,0);
这样建立的话,程序会崩溃.

所以求救,整个实验室就我一个人学ace,也不知道问谁呢-_-!!
我想要实现的是:
建立多线程;
每个线程(作为发送端使用)都有自己的ace_proactor,proactor的end和run不影响其他的线程;
每个线程都能被终止;

[ 本帖最后由 Jekin 于 2009-5-21 19:16 编辑 ]

winston 发表于 2009-5-21 19:35:24

你终于说明白了。

winston 发表于 2009-5-21 19:38:52

给你解释一下:
1、系统中运行多个Proactor实例,一般来说是毫无必要的。一个就成。所以,完全可以用那个单体。
2、可以有很多线程同时跑Proactor框架,这里面有个概念很绕人,请搜索一下论坛,我有说明和解释。
3、每个建立的连接对,都是一个对象,不一定是什么线程运行它,但是毫无关系,它自己可以随意收发信息、关闭。
我相信你对Proactor的理解还没深刻,仔细想想,不明白再问大家。
页: [1]
查看完整版本: ACE_OS::closesocket(this->handle())无法关闭套接字