boost库之socket 非阻塞/缓冲区大小等属性设置

原文:http://blog.csdn.net/byxdaz/article/details/77318219
asio socket 非阻塞/缓冲区大小等属性设置
ip::tcp::socket m_socket
 
 //设置阻塞与非阻塞
void SetNoBlock(bool bNoBlock)
{
 if(bNoBlock)
 {
  boost::asio::ip::tcp::socket::non_blocking_io io_option(true);
  m_socket.io_control(io_option);
 }
 else
 {
  //阻塞
  boost::asio::ip::tcp::socket::non_blocking_io io_option(false);
  m_socket.io_control(io_option);
 }
}
//设置发送缓冲区大小
void SetSendBufferSize(int nSize)
{
 boost::asio::socket_base::send_buffer_size size_option(nSize);
 m_socket.set_option(size_option);
}
//设置接收缓冲区大小
void SetRecvBufferSize(int nSize)
{
 boost::asio::socket_base::receive_buffer_size size_option(nSize);
 m_socket.set_option(size_option);
}
socket 端口复用
1).在boost的acceptor类说明中有这样的一个例子。用set_option设置端口是否可复用。
 boost::asio::ip::tcp::acceptor acceptor(io_service);
 boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port);
 acceptor.open(endpoint.protocol());
 acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
 acceptor.bind(endpoint);
 acceptor.listen();
2).还有一种方法 就是在acceptor的构造函数,下面是acceptor的构造函数,我们看到,第三个参数名reuse_addr 。默认是可以端口复用的,要设置是否复用,也可以通过该处传参。
basic_socket_acceptor(boost::asio::io_service& io_service,const endpoint_type& endpoint, bool reuse_addr = true)
//不停留,不管数据多小都发送到对端。停留,只有数据达到一定大小或者超时时,将数据发送对倒对端。
m_socket.set_option(boost::asio::ip::tcp::no_delay(true));
//保持常连接
m_socket.set_option(boost::asio::socket_base::keep_alive(true));
同步连接超时设置,没有对应的set_option参数,asio自带的例子里是用deadline_timer的async_wait方法来实现超时。
1).deadline_timer的async_wait方法
参考:http://blog.csdn.net/li_jian_xing/article/details/50394116
2).传统的Winsock编程可以先把socket设为非阻塞,然后connect,通过boost::asio::ip::tcp::socket类的native函数获取到原始sokcet,再用select来判断超时,asio也可以这样做,唯一“非主流”的是asio里没有一个类似select的函数,所以得调用原始的Winsock API,也就牺牲了跨平台。
参考:http://blog.csdn.net/lazy_cc/article/details/7941069

boost库之socket 非阻塞/缓冲区大小等属性设置

2017-08-17 11:05 852人阅读 评论(0) 收藏 举报
 分类:
boost(14) 

版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/byxdaz/article/details/77318219

asio socket 非阻塞/缓冲区大小等属性设置
ip::tcp::socket m_socket
 
 //设置阻塞与非阻塞
void SetNoBlock(bool bNoBlock)
{
 if(bNoBlock)
 {
  boost::asio::ip::tcp::socket::non_blocking_io io_option(true);
  m_socket.io_control(io_option);
 }
 else
 {
  //阻塞
  boost::asio::ip::tcp::socket::non_blocking_io io_option(false);
  m_socket.io_control(io_option);
 }
}
//设置发送缓冲区大小
void SetSendBufferSize(int nSize)
{
 boost::asio::socket_base::send_buffer_size size_option(nSize);
 m_socket.set_option(size_option);
}
//设置接收缓冲区大小
void SetRecvBufferSize(int nSize)
{
 boost::asio::socket_base::receive_buffer_size size_option(nSize);
 m_socket.set_option(size_option);
}
socket 端口复用
1).在boost的acceptor类说明中有这样的一个例子。用set_option设置端口是否可复用。
 boost::asio::ip::tcp::acceptor acceptor(io_service);
 boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port);
 acceptor.open(endpoint.protocol());
 acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
 acceptor.bind(endpoint);
 acceptor.listen();
2).还有一种方法 就是在acceptor的构造函数,下面是acceptor的构造函数,我们看到,第三个参数名reuse_addr 。默认是可以端口复用的,要设置是否复用,也可以通过该处传参。
basic_socket_acceptor(boost::asio::io_service& io_service,const endpoint_type& endpoint, bool reuse_addr = true)
//不停留,不管数据多小都发送到对端。停留,只有数据达到一定大小或者超时时,将数据发送对倒对端。
m_socket.set_option(boost::asio::ip::tcp::no_delay(true));
//保持常连接
m_socket.set_option(boost::asio::socket_base::keep_alive(true));
同步连接超时设置,没有对应的set_option参数,asio自带的例子里是用deadline_timer的async_wait方法来实现超时。
1).deadline_timer的async_wait方法
参考:http://blog.csdn.net/li_jian_xing/article/details/50394116
2).传统的Winsock编程可以先把socket设为非阻塞,然后connect,通过boost::asio::ip::tcp::socket类的native函数获取到原始sokcet,再用select来判断超时,asio也可以这样做,唯一“非主流”的是asio里没有一个类似select的函数,所以得调用原始的Winsock API,也就牺牲了跨平台。
参考:http://blog.csdn.net/lazy_cc/article/details/7941069

boost库之socket 非阻塞/缓冲区大小等属性设置相关推荐

  1. php socket非阻塞,php stream_set_blocking设置非阻塞模式,php stream_set_blocking影响函数fgets()和fread()...

    stream_set_blocking函数可以将资源流设置为阻塞模式或者非阻塞模式,主要影响的函数分别是fgets,fread,其他的手册没有说. 在socket编程中,如果一个socket连接上了, ...

  2. C# socket通信 接收缓冲区大小设置,以及粘包问题的解决

    C# socket通信 接收缓冲区大小,以及粘包问题的解决 一. Socket接收缓冲区无论: 1.buffer设置有多大: 2.同步接收还是异步接收: 3.发送超过 43690 也就是 42KB的字 ...

  3. 【Java 网络编程】客户端 Socket 配置 ( 超时时间 | 端口复用 | Nagle 算法 | 心跳包机制 | 连接关闭机制 | 缓冲区大小 | 性能权重设置 | 紧急数据设置 )

    文章目录 I 设置读取超时时间 II Socket 复用绑定端口设置 III 开启 Nagle 算法 ( 沾包 ) IV 心跳包机制 V 连接关闭处理 VI Socket 紧急数据内敛设置 VII S ...

  4. epoll关于ET、LT模式和socket非阻塞模式的几个总结

    epoll的ET和LT模式 LT水平触发是默认的模式,只要缓冲区有消息就会触发,如果这次事件没有被处理,那么下一次调用epoll_wait的时候,事件仍然会被触发:ET边沿触发只会在第一次有消息的时候 ...

  5. Java nio Socket非阻塞模式

    NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有 事件发生时,他会通知我们,传回一组Select ...

  6. java 阻塞 socket_java socket非阻塞I/O

    1      非阻塞(Nonblocking)体系结构 在这一部分,我将从理论的角度来解释非阻塞体系的结构及其工作原理.这部"喜剧"(当然,如果你喜欢的话也可以称做戏剧)的&quo ...

  7. C++ TCP socket 非阻塞连接超时设定方式

    由于网上大部分教程为阻塞方式连接,当项目需要大量连接从机的情况下,阻塞式连接socket会导致长时间卡顿.因此需要用非阻塞式的方式连接,并设置超时是时间,再设置会阻塞.下属C++编辑代码实测可用,代码 ...

  8. Socket 非阻塞模式下connect 返回EINPROGRESS(115)错误

    今天再测试socket的时候,发现一个很奇怪的问题,就是客户端再connect的时候第一次connect总是会返回-1,errno是115,往往第二次连接就可以成功了.但是对于服务端来说,第一次连接已 ...

  9. linux非阻塞输入函数,Linux fcntl函数设置阻塞与非阻塞

    转自http://www.cnblogs.com/xuyh/p/3273082.html 用命令F_GETFL和F_SETFL设置文件标志,比如阻塞与非阻塞 F_SETFL     设置给arg描述符 ...

最新文章

  1. 我的第一份工作是个小公司
  2. jquery的deferred对象
  3. Reactive Extensions入门(5):ReactiveUI MVVM框架
  4. android remoteviews 设置背景,Android通过RemoteViews实现跨进程更新UI示例
  5. 一步一步SharePoint 2007之二十五:编写一个最简单的WebPart(3)——添加WebPart
  6. 2021年程序员1月薪资大幅度上涨,你的2021有奔头了吗?
  7. php html转换数组,将html标签转换为php数组
  8. Golang实践录:调用C++函数的优化
  9. sql server计算机用户权限,SQL Server新增用户并控制访问权限设置。
  10. 《推荐系统笔记(十二)》聚类生成标签以及基于标签的TopN推荐
  11. paip.提升用户体验---文件查找
  12. allegro 导 bom
  13. 什么是flex布局,它的常用属性有哪些
  14. 玻色量子与华夏、人行、龙盈智达联合发表量子金融研究成果
  15. 我裸辞全职接单第一个月的收入
  16. windows adb usb 找不到设备的解决方法
  17. Smokeping安装教程
  18. 【Linux命令】挂盘相关命令,包含可扩展硬盘
  19. 学生如何免费激活JetBrain所有产品(PyCharm,IDEA......)
  20. 读书笔记 -- 《瓦尔登湖》

热门文章

  1. oracle数据库查询表语句,oracle数据库重要的查询语句
  2. Placement new的用法及用途
  3. mysql构建镜像时写入密码_用Dockerfile手动创建mysql5.7主从镜像
  4. 15g1和g2和g3区别大吗_河南成人高考和普通高考的区别有哪些?成人高考难度会越来越大吗?...
  5. chrome 禁用恢复页面提示_有哪些很值得推荐的Chrome插件?精选7款实用插件
  6. 聚合函数的计算机控件,使用Kendo UI MVC Grid包装器的聚合函数
  7. mysql多数据源切换_Springboot项目实现Mysql多数据源切换的完整实例
  8. Spring官宣网传大漏洞,附解决方案!网传方案有隐患,建议加固!
  9. 分布式 WebSocket 集群解决方案
  10. 在Spring Boot中实现通用Auth认证的几种方式