[关闭]
@Pigmon 2020-04-21T11:04:29.000000Z 字数 1810 阅读 1147

Boost::asio::udp 发送不定长的字符串

C++


官网的例子比较匪夷所思,我根据你的需求写了一个最简单的例子,你照着修改就可以发送不定长的json字符串了。
时间有限,我也是现学的,凑合看吧。注释写的很清楚了(我认为)。
endpoint 没查怎么翻译,我暂时理解为一种对一个端点的描述结构,所以翻译为 发送端描述 和 接收端描述。
本地收发,发送端口 8110,接收端口 8111。

发送端

  1. #include <iostream>
  2. #include <string>
  3. #include <boost/asio.hpp>
  4. using boost::asio::ip::udp;
  5. // 这里弄个简单的不定长字符串数组循环发送
  6. int index = 0;
  7. std::string array_str[] = { "short", "little longer", "this is a much much longer string", "emmm..." };
  8. // 读取上面的不定长字符串数组,用来发给接收端
  9. std::string make_multi_size_string()
  10. {
  11. std::string ret = array_str[index++];
  12. if (index > 3) index = 0;
  13. return ret;
  14. }
  15. int main()
  16. {
  17. try
  18. {
  19. // 这句必须有,先别考虑原因
  20. boost::asio::io_context io_context;
  21. // 生成IP地址
  22. boost::asio::ip::address addr = boost::asio::ip::address::from_string("127.0.0.1");
  23. // 生成接收端描述 (IP, Port)
  24. udp::endpoint remote_endpoint(addr, 8111);
  25. // 建立 socket,第二个参数是发送端描述 (协议,发送端端口)
  26. udp::socket socket(io_context, udp::endpoint(udp::v4(), 8110));
  27. while (true)
  28. {
  29. // 读取一个字符串
  30. std::string message = make_multi_size_string();
  31. // 核心操作:send_to ,把读取到的字符串发送给接收端
  32. size_t sentn = socket.send_to(boost::asio::buffer(message), remote_endpoint);
  33. std::cout << sentn << " Bytes sent.\n";
  34. Sleep(200);
  35. }
  36. }
  37. catch (std::exception& e)
  38. {
  39. std::cerr << e.what() << std::endl;
  40. }
  41. return 0;
  42. }

接收端

  1. #include <iostream>
  2. #include <boost/array.hpp>
  3. #include <boost/asio.hpp>
  4. using boost::asio::ip::udp;
  5. int main(int argc, char* argv[])
  6. {
  7. try
  8. {
  9. // 这句必须有,先别考虑原因
  10. boost::asio::io_context io_context;
  11. // 建立 socket,(协议,接收端口)
  12. udp::socket socket(io_context, udp::endpoint(udp::v4(), 8111));
  13. while (true)
  14. {
  15. // 接收的缓存,如果是你的json应该申请为1024就够了吧。
  16. boost::array<char, 128> recv_buf;
  17. // 这是个输出参数,发送端描述,这里没啥用。
  18. // 但这个函数好像不存在没有这个参数的重载,所以只能写上。
  19. udp::endpoint sender_endpoint;
  20. // 核心操作:receive_from,将接受内容写入 recv_buf
  21. size_t len = socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint);
  22. // 根据接收数据长度截取字符串并输出,就是得到了最终的结果
  23. // 实际使用应该用string操作截取,这里我没时间弄了
  24. std::cout.write(recv_buf.data(), len);
  25. std::cout << std::endl;
  26. Sleep(200);
  27. }
  28. }
  29. catch (std::exception& e)
  30. {
  31. std::cerr << e.what() << std::endl;
  32. }
  33. return 0;
  34. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注