找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4002|回复: 1

ACE_Connector重连出错

[复制链接]
发表于 2007-12-28 23:33:23 | 显示全部楼层 |阅读模式
ACE_Connector<BillingHandler, ACE_SOCK_CONNECTOR> m_Connector;重连部分代码:
  1. BillingHandler* pHandler = this;
  2.   nRet = m_Connector.connect(pHandler, m_SvrAddr, ACE_Synch_Options::asynch);
  3.   if(nRet==-1)
  4.   {
  5.     int nErrno = errno;
  6.     if(nErrno != EWOULDBLOCK)
  7.     //nErrno总是返回10038
  8.     ...........
  9.   }
  10. 连接关闭的处理:
  11. int BillingHandler::handle_close(ACE_HANDLE, ACE_Reactor_Mask)
  12. {
  13.   ACE_Reactor::instance()->remove_handler(this, ACE_Event_Handler::ALL_EVENTS_MASK|ACE_Event_Handler::DONT_CALL);
  14.   if(get_handle() != ACE_INVALID_HANDLE)
  15.   {
  16.     m_Peer.close();
  17.     m_Connector.cancel(this);
  18.   }
  19.   ...
  20. }
复制代码
连接完成时的处理:
  1. int BillingHandler::open(void*)
  2. {
  3.   m_Peer = peer();
  4.   if(m_Peer.enable(ACE_NONBLOCK) == -1)
  5.   {
  6.     ACE_ERROR_RETURN((LM_ERROR, "(%t) %p\n", "enable"), -1);
  7.   }
  8.   
  9.   if(ACE_Reactor::instance()->->register_handler(this, ACE_Event_Handler::READ_MASK) == -1)
  10.   {
  11.     ACE_ERROR_RETURN((LM_ERROR,"(%t) %p\n","register_handler"), -1);
  12.   }
  13.     return 0;
  14. }
复制代码
重连时nErrno总是返回10038, 问题出在哪里呢?或者handle_close处理不当?
 楼主| 发表于 2007-12-28 23:33:38 | 显示全部楼层
10038—WSAENOTSOCK
Socket operation on an invalid socket. This error can be returned from any Winsock function that takes a SOCKET handle as a parameter. This error indicates that the supplied socket handle is not valid.

你的代码返回这个错误,说明socket已经被关闭了,你后续的所有socket操作,都是无效的。
解决办法也简单,你delete这个handler,然后通过重新连接,重新建立一个就成了。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-5-18 19:51 , Processed in 0.072289 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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