c++ - 如何使用 boost::asio 从 UDP 端口接收广播数据包和发送数据
问题描述
如果之前已经回答了这个问题,我会提前道歉,但我已经搜索并没有发现任何对我有帮助的东西。我正在尝试从服务器广播到一组侦听任何消息的客户端。当客户端收到广播消息时,它会向服务器发送另一条消息。
.--------.
.--------.|
.--------. address: any address: any .--------.||
| | port: any / \ port: 8888 | |||
| server |-( ----------->| address: broadcast |----------> )-| client ||'
| | \ port: 8888 / | |'
| | | |
'--------'-( <----------- ( address: server ) <---------- )-'--------'
( port: 8888 ? )
服务器.cpp
#include <iostream>
#include <boost/asio.hpp>
#include <boost/array.hpp>
int main()
{
namespace ip = boost::asio::ip;
boost::asio::io_service io_service;
// Server binds to any address and any port.
ip::udp::socket socket(io_service,
ip::udp::endpoint(ip::udp::v4(), 0));
socket.set_option(boost::asio::socket_base::broadcast(true));
// Broadcast will go to port 8888.
ip::udp::endpoint broadcast_endpoint(ip::address_v4::broadcast(), 8888);
// Broadcast data.
boost::array<char, 4> buffer;
socket.send_to(boost::asio::buffer(buffer), broadcast_endpoint);
ip::udp::endpoint sender_endpoint;
std::size_t bytes_transferred = socket.receive_from(boost::asio::buffer(buffer), sender_endpoint);
std::cout << "Server got " << bytes_transferred << " bytes." << std::endl;
}
客户端.cpp
#include <iostream>
#include <boost/asio.hpp>
#include <boost/array.hpp>
int main()
{
namespace ip = boost::asio::ip;
boost::asio::io_service io_service;
// Client binds to any address on port 8888 (the same port on which
// broadcast data is sent from server).
ip::udp::socket socket(io_service,
ip::udp::endpoint(ip::udp::v4(), 8888 ));
ip::udp::endpoint sender_endpoint;
// Receive data.
boost::array<char, 4> buffer;
std::size_t bytes_transferred = socket.receive_from(boost::asio::buffer(buffer), sender_endpoint);
std::cout << "Client got " << bytes_transferred << " bytes." << std::endl;
boost::asio::ip::udp::resolver resolver(io_service);
boost::asio::ip::udp::resolver::query query(boost::asio::ip::udp::v4(), "localhost", "8888");
boost::asio::ip::udp::resolver::iterator iter = resolver.resolve(query);
boost::asio::ip::udp::endpoint remote_endpoint = *iter;
socket.send_to(boost::asio::buffer(buffer), remote_endpoint);
}
client
接收广播消息,但server
不接收由 . 发送的消息client
。
提前致谢。
解决方案
推荐阅读
- firebase - 在颤动中获取用户数据到firestore?
- sql - 在 postgresql 中添加由 id 引用链接的单元序列
- spring-boot - 无法使用其他角色进行操作,然后是超级用户
- node.js - Node JS - 在promise-ftp上没有管道无法获取流数据
- powerbi - Power BI 如何找到一个月的结束日期 Q
- microsoft-graph-api - 将图形与现场交换服务器一起使用
- postgresql - 使用 TypeORM 保存实体列表
- css - 为什么 calc 函数在相对位置的高度上不起作用?
- node.js - 方法:电子表格.values.append TypeError: Converting circular structure to JSON
- ios - 删除 WKWebView 中的网站顶部导航栏