鱼C论坛

 找回密码
 立即注册
查看: 2243|回复: 0

[技术交流] 《C++Boost库asio》第九篇

[复制链接]
发表于 2017-7-12 15:23:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Echo服务器对应的C++客户端 :
(对照上一篇来学习,接收和发送的顺序是一样的)


  1. // Echo服务器对应的C++客户端 :
  2. // 同步的,阻塞式的客户端
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <boost\asio.hpp>
  7. #include <boost\array.hpp>

  8. //不用UDP协议的原因是包的大小有限制,然后有可能是乱序,
  9. // 重发,丢包都有可能,有TCP还是比较简单安全的

  10. using boost::asio::ip::tcp;

  11. enum { max_length = 1024 };

  12. int main()
  13. {
  14.         boost::asio::io_service io_service;

  15.         tcp::socket s(io_service);
  16.         tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"), 2001);
  17.         s.connect(ep);

  18.         //在这里,3次握手成功

  19.         size_t request_length = 1024;
  20.         char reply[max_length];
  21.         size_t reply_length;
  22.         // --接收服务器发来的当前时间 ;       


  23.         boost::array<char, 128> buf;//字节流缓存
  24.         boost::system::error_code error;//错误码的形式来返回错误,而不是用抛出异常的方式
  25.         size_t len = s.read_some(boost::asio::buffer(buf), error);//开始读取服务器发来的数据
  26.         if (error == boost::asio::error::eof)
  27.         {
  28.                 return 0;// 服务器关闭了连接,客户端可以直接退出了
  29.         }
  30.         else if (error)
  31.         {
  32.                 throw boost::system::system_error(error);//一些其他的错误
  33.         }
  34.         std::cout << "Reply is :";
  35.         std::cout.write(buf.data(), len);//输出到控制台


  36.         // --发消息给服务器 ;
  37.         std::cout << "Enter message:";
  38.         char request[max_length];
  39.         std::cin.getline(request, max_length);//输入
  40.         request_length = std::strlen(request);
  41.         boost::asio::write(s, boost::asio::buffer(request, request_length)); // 出错会抛出异常;

  42.         // --接收服务器发来的消息 ;
  43.         //错了会抛异常,真正收到request_length多长度的数据后才会往下走,否则一直等待
  44.         reply_length = boost::asio::read(s, boost::asio::buffer(reply,request_length));
  45.         std::cout << "Reply is :";
  46.         std::cout.write(reply, reply_length);//输出到控制台


  47.         getchar();
  48.         system("pause");
  49.     return 0;
  50. }
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
小甲鱼 + 3 + 3 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 06:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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