织梦CMS - 轻松建站从此开始!

罗索

WSASend/WSARecv异步返回WSAENOBUFS(10055)

落鹤生 发布于 2011-03-08 17:18 点击:次 
一般来说这个错误都是由于系统可用的非分页内存不够导致的。WSASend需要在非分页内存中锁定内存,如果失败,则返回这个错误。
TAG:

一般来说这个错误都是由于系统可用的非分页内存不够导致的。WSASend需要在非分页内存中锁定内存,如果失败,则返回这个错误。

有时候观察系统内存还有很多,但是依然发生了这个错误,多出现于虚拟机环境中。具体原因未知,但当时的确存在系统缓冲区不足的问题,例如ipconfig都无法显示完整信息。

为了避免或尽可能的减少此类错误的返回,程序上可以做一些调整,或者符合某些编码范式。

首 先注意不要调用WSASend发送一个巨大的数据包,多大才算巨大,这个取决于不同的环境,一般来说8192是一个上限。因为这个值正好为许多系统缺省的 socket buffer。如果需要发大包,那么最好是调用多次WSASend。其次最好不要同时调用多次异步WSASend,应该首先将数据包插入队列,然后在完成 了一次WSASend之后再检查队列,发送下一个。

 

  1. void do_async_send(T_SBUF buffer) 
  2.     if(closed_ || !connected_) return on_async_send_fail(buffer); 
  3.  
  4.     bool send = pending_buffers_.empty(); 
  5.     pending_buffers_.push_back(buffer); 
  6.  
  7.     if(send) 
  8.     { 
  9.         boost::asio::async_write(socket_, 
  10.             buffer, 
  11.             strand_.wrap(boost::bind(&tcp_client::handle_send, 
  12.             shared_from_this(), 
  13.             boost::asio::placeholders::error,buffer))); 
  14.     } 
  15. void handle_send(const boost::system::error_code& error,T_SBUF buffer) 
  16.     if(closed_) return
  17.  
  18.     _ASSERT(!pending_buffers_.empty()); 
  19.     _ASSERT(buffer == pending_buffers_.front()); 
  20.  
  21.     if(error) return do_stop(error); 
  22.     if(pending_buffers_.empty()) {_ASSERT(false);return do_stop(error);} 
  23.     pending_buffers_.pop_front(); 
  24.  
  25.     if(!on_send(buffer)) 
  26.     { 
  27.         graceful_close_ = true
  28.         return do_stop(boost::system::error_code()); 
  29.     } 
  30.  
  31.     if(!pending_buffers_.empty()) 
  32.     { 
  33.         T_SBUF next_buffer = pending_buffers_.front(); 
  34.         boost::asio::async_write(socket_, 
  35.             next_buffer, 
  36.             strand_.wrap(boost::bind(&tcp_client::handle_send, 
  37.             shared_from_this(), 
  38.             boost::asio::placeholders::error,next_buffer))); 
  39.     } 

 

(胡宇光)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201103/11040.html]
本文出处:huyuguang1976.spaces.live.com 作者:胡宇光
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容