boot asio 非阻塞同步编程---非阻塞的accept和receive。

客户端编程:

  1. #include<boost/timer.hpp>
  2. #include <iostream>
  3. #include <boost/asio.hpp>
  4. #include <stdlib.h>
  5. using namespace boost::asio;
  6. using namespace std;
  7. #define RECEIVE_BUF_SIZE 100
  8. #define RECEIVE_BYTE_NUM 30
  9. int readMaxBytesInTime(ip::tcp::socket & socket,char * strBuf,int nMaxBytes,int nMilSec)
  10. {
  11. boost::timer t;
  12. int nTotalRec = 0;
  13. int nLeftBytes = nMaxBytes - nTotalRec;
  14. while(1)
  15. {
  16. boost::system::error_code ec;
  17. char buf[RECEIVE_BUF_SIZE];
  18. int nWantBytes = 0;
  19. if(nLeftBytes < RECEIVE_BUF_SIZE)
  20. {
  21. nWantBytes = nLeftBytes;
  22. }
  23. else
  24. {
  25. nWantBytes = RECEIVE_BUF_SIZE;
  26. }
  27. size_t len=socket.read_some(buffer(buf,nWantBytes), ec);
  28. if(len>0)
  29. {
  30. memcpy(strBuf + nTotalRec,buf,len);
  31. nTotalRec += len;
  32. nLeftBytes -= len;
  33. if(nLeftBytes <= 0)
  34. break;
  35. else
  36. continue;
  37. }
  38. else
  39. {
  40. if(t.elapsed()*1000 < nMilSec)
  41. {
  42. Sleep(0);
  43. continue;
  44. }
  45. else
  46. break;
  47. }
  48. }
  49. return nTotalRec;
  50. }
  51. int main(int argc, char* argv[])
  52. {
  53. // 所有asio类都需要io_service对象
  54. io_service iosev;
  55. // socket对象
  56. ip::tcp::socket socket(iosev);
  57. socket.open(boost::asio::ip::tcp::v4());
  58. socket.io_control(boost::asio::ip::tcp::socket::non_blocking_io(true));
  59. // 连接端点,这里使用了本机连接,可以修改IP地址测试远程连接
  60. ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1000);
  61. // 连接服务器
  62. boost::system::error_code ec;
  63. boost::timer t;
  64. socket.connect(ep,ec);
  65. cout<< t.elapsed()<<"s"<<endl;
  66. system("PAUSE");
  67. // 如果出错,打印出错信息
  68. if(ec)
  69. {
  70. std::cout << boost::system::system_error(ec).what() << std::endl;
  71. return -1;
  72. }
  73. // 接收数据
  74. char buf[RECEIVE_BYTE_NUM];
  75. int len = readMaxBytesInTime(socket,buf,RECEIVE_BYTE_NUM,1000);
  76. std::cout<<"接收字节数:"<<len<<std::endl;
  77. std::cout.write(buf, len);
  78. system("PAUSE");
  79. return 0;
  80. }

服务器端编程:

  1. #include <iostream>
  2. #include <boost/asio.hpp>
  3. #include <stdlib.h>
  4. int main(int argc, char* argv[])
  5. {
  6. using namespace boost::asio;
  7. // 所有asio类都需要io_service对象
  8. io_service iosev;
  9. ip::tcp::acceptor acceptor(iosev);
  10. acceptor.open(boost::asio::ip::tcp::v4());
  11. acceptor.io_control(boost::asio::ip::tcp::socket::non_blocking_io(true));
  12. // 连接端点,这里使用了本机连接,可以修改IP地址测试远程连接
  13. ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1000);
  14. acceptor.bind(ep);
  15. acceptor.listen();
  16. for(;;)
  17. {
  18. boost::system::error_code ec;
  19. // socket对象
  20. ip::tcp::socket socket(iosev);
  21. // 等待直到客户端连接进来
  22. while (1)
  23. {
  24. acceptor.accept(socket,ec);
  25. if(ec)
  26. {
  27. std::cout <<
  28. boost::system::system_error(ec).what() << std::endl;
  29. Sleep(10);
  30. }
  31. else
  32. break;
  33. }
  34. system("PAUSE");
  35. // 显示连接进来的客户端
  36. std::cout << socket.remote_endpoint().address() << std::endl;
  37. // 向客户端发送hello world!
  38. char * str = "hello world!hello world!";
  39. socket.write_some(buffer(str,20), ec);
  40. // 如果出错,打印出错信息
  41. if(ec)
  42. {
  43. std::cout <<
  44. boost::system::system_error(ec).what() << std::endl;
  45. break;
  46. }
  47. // 与当前客户交互完成后循环继续等待下一客户连接
  48. }
  49. return 0;
  50. }

最新文章

  1. DB2常用sql函数 (转载)
  2. Java读写文件的几种方式
  3. python 操作mysql
  4. centos中更换jdk的版本
  5. BZOJ 1724 切割木板
  6. mysql 管理、备份、还原及查询的图形化gui工具
  7. HD1004Let the Balloon Rise
  8. 【软件工程-Teamwork 3】团队角色分配和团队贡献分分配规则
  9. 未能加载文件或程序集“Interop.jmail”或它的某一个依赖项
  10. Mysql MyISAM数据库批量转换表引擎为Innodb
  11. NRE
  12. CocoaPods详解之----进阶篇
  13. 采纳ajax提交POST样本数据
  14. javascript location对象
  15. mysql常用sql命令
  16. Boyer-Moore算法
  17. PEP8中文翻译(转)
  18. 自动化测试的Selenium的python版安装与使用
  19. python全栈开发day53-mysql
  20. GlusterFS 增删节点及改变复制份数

热门文章

  1. JavaWeb 文件上传下载
  2. Struts2的&lt;s:date&gt;标签使用详解[转]
  3. 分析新建的android代码
  4. 汇编笔记 RETF
  5. graphlab 安装好后的导入配置
  6. ubuntu安装Qt5
  7. C# 实现WinForm窗口最小化到系统托盘代码
  8. FilterDispatcher处理流程
  9. release与debug的区别
  10. 程序员怎样迈出从5K到1W的重要一步