找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4550|回复: 4

非阻塞sock下对send数据进行的封装,抛砖引玉

[复制链接]
发表于 2011-3-29 11:49:26 | 显示全部楼层 |阅读模式
//设置sock非阻塞
  1. int
  2. Connection_Handler::open(void *p)
  3. {
  4.   if (this->peer().enable(ACE_NONBLOCK) == -1)
  5.     return -1;
  6.   if ( ACE_Reactor::instance()->register_handler
  7.         (this,ACE_Event_Handler::READ_MASK) ==-1 )
  8.     return -1;
  9.   return 0;
  10. }
复制代码
//发送数据
  1. int
  2. Connection_Handler::send(const char* buff, size_t len)
  3. {
  4.   int empty_queue = this->msg_queue()->is_empty();
  5.   ssize_t sent = 0;
  6.   if (empty_queue)
  7.   {
  8.     ssize_t sent =
  9.          this->peer().send(buff, len);
  10.     if (sent == len)
  11.       return 0;
  12.     if (sent == -1 && errno != EWOULDBLOCK)
  13.       ACE_ERROR_RETURN((LM_ERROR,
  14.                         ACE_TEXT("(%P|%t) %p\n"),
  15.                         ACE_TEXT("send")),
  16.                         0);
  17.     if (sent == -1)
  18.       sent = 0;
  19.   }
  20.   ACE_Message_Block *mb = 0;
  21.   size_t remaining = static_cast<size_t>(len - sent);
  22.   ACE_NEW_RETURN(mb,ACE_Message_Block(&buff[sent],remaining),-1);
  23.   ACE_Time_Value nowait(ACE_OS::gettimeofday());
  24.   if (this->putq(mb, &nowait) == -1)
  25.   {
  26.     ACE_ERROR((LM_ERROR,
  27.                ACE_TEXT("(%P|%t) %p\n"),
  28.                ACE_TEXT("enqueue failed")));
  29.     mb->release();
  30.     return 0;
  31.   }
  32.   if (empty_queue)
  33.     return this->reactor()->register_handler
  34.                 (this, ACE_Event_Handler::WRITE_MASK);
  35.   return 0;
  36. }
复制代码
handle_output,handle_close,handle_input可参考书上例子,说的很清楚,只是多线程下handle_input中可能会有EWOULDBLOCK,加上如下判断
  1. if (recv_cnt == -1)
  2.   {
  3.     if(errno != EWOULDBLOCK)
  4.       ACE_ERROR_RETURN((LM_ERROR,
  5.                         ACE_TEXT("(%P|%t) %p\n"),
  6.                         ACE_TEXT("peer failed unexpectedly")),
  7.                         -1);
  8.     else
  9.       return 0;
  10.   }
复制代码
重点是如何send数据,如果不调用this->peer().send方法,直接放入队列,再登记写事件也是可以,但要保证是lt触发,
et下未必会及时通知写事件。
另外是单线程下使用,多线程自己加锁。
 楼主| 发表于 2011-3-29 11:50:11 | 显示全部楼层
沙发自己坐先...
发表于 2011-3-29 12:49:24 | 显示全部楼层
使用notify即可
发表于 2011-3-31 01:52:45 | 显示全部楼层
这样的封装应该在应用层。在非阻塞sock下,意义不大。
 楼主| 发表于 2011-3-31 09:17:39 | 显示全部楼层
这个就是应用层的封装
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-22 21:18 , Processed in 0.018946 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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