- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已将 Boost 白天客户端教程中的 UDP 客户端代码修改为以下内容:
class UDPClient
{
public:
udp::socket* socket;
udp::endpoint* receiver_endpoint;
boost::array<char, 1024> recv_buffer;
UDPClient();
void do_receive();
void handle_receive(const boost::system::error_code& error, size_t);
};
UDPClient::UDPClient()
{
boost::asio::io_service io_service;
udp::resolver resolver(io_service);
udp::resolver::query query(udp::v4(), "127.0.0.1", "8888");
receiver_endpoint = new udp::endpoint(*resolver.resolve(query));
socket = new udp::socket(io_service);
socket->open(udp::v4());
do_receive();
while (true)
{
io_service.poll();
Sleep(1);
}
}
void UDPClient::do_receive()
{
socket->async_receive_from(boost::asio::buffer(recv_buffer), *receiver_endpoint,
boost::bind(&UDPClient::handle_receive, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void UDPClient::handle_receive(const boost::system::error_code& error, size_t bytes_transferred)
{
cout << "ulala" << endl;
if (!error || error == boost::asio::error::message_size)
do_receive();
}
如果一切按计划进行,只有在有传入消息时才会打印“ulala”。然而,这里不是这种情况......无论是否有传入消息,都会立即调用处理程序并打印“ulala”。我尝试了一些不同的方法:将 io_service.poll() 与 io_service.run() 和 io_service.run_one() 交换,以及删除 Sleep(1),但这些更改都没有对问题产生任何影响。我该怎么办?
提前致谢!
最佳答案
socket = new udp::socket(io_service);
socket->open(udp::v4());
设置一个用于发送到任意端点的套接字。要接收(“收听”),请使用
socket = new udp::socket(io_service, udp::endpoint(udp::v4(), 8888));
除此之外,socket 和 receiver_endpoint 现在已经泄露。要解决这个问题:
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/array.hpp>
#include <iostream>
using boost::asio::ip::udp;
class UDPClient
{
public:
boost::asio::io_service io_service;
udp::socket socket;
udp::endpoint receiver_endpoint;
boost::array<char, 1024> recv_buffer;
UDPClient();
void do_receive();
void handle_receive(const boost::system::error_code& error, size_t);
};
UDPClient::UDPClient()
: io_service(),
socket(io_service, {udp::v4(), 8888})
{
do_receive();
io_service.run();
}
void UDPClient::do_receive()
{
socket.async_receive_from(boost::asio::buffer(recv_buffer), receiver_endpoint,
boost::bind(&UDPClient::handle_receive, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void UDPClient::handle_receive(const boost::system::error_code& error, size_t bytes_transferred)
{
std::cout << "ulala" << std::endl;
std::cout << "Received: '" << std::string(recv_buffer.begin(), recv_buffer.begin()+bytes_transferred) << "'\n";
if (!error || error == boost::asio::error::message_size)
do_receive();
}
int main()
{
UDPClient updclient;
}
这也会打印收到的消息(假设它是可打印的)。见
寻求一种可以同时处理多个 UDP 请求的方法。
关于c++ - 即使没有传入消息,Boost ASIO UDP 客户端 async_receive_from 也会调用处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26820215/
对于通过 UDP 进行的一些数据传输,我使用了来自 boost 的 async_receive_from 函数。我的接收函数是 udp::socket socket_;
在我发现的所有样本中,我看不到任何缓冲。这是否意味着在处理程序中我总是收到完整的消息?没有分块。 我在文档中找不到任何答案。 Is boost::asio::ip::udp::socket::asyn
下面从真实代码库简化而来的 MVCE 显示了同样的问题。 服务器连续发送 5 个 UDP 帧的“突发”,其中填充了 150 个字节的值 0xA5,中间有很小的延迟或没有延迟。暂停 1 秒。 客户端使用
我在 udp_server 类中创建了异步函数 start_receive() 和 start_send()。但是通过代码不会停止并等待“async_receive_from”行。这是我的代码; cl
我正在使用 async_receive_from 读取多播输入。所以我的想法是,当我检测到间隙时,我将通知另一个帮助线程请求/获取间隙填充消息。虽然这是在工作中,但主线程将继续接收和排队任何传入的消息
在下面的代码中,asynch_receive_from 的行为是同步的。在收到数据之前它不会返回。查看最后的日志表明了这一点。这可能不是那个一开始很明显,因为有相当高的数据传入率。但是当没有数据时,只
我正在使用 boost::asio 来捕获 udp 端口上的数据包。我只是新来的。如何使 async_receive_from 复制数据以仅缓冲具有指定源 ip 的数据包? 最佳答案 根据您所说的
我有一个 boost 套接字,我在上面定义了一个异步接收: void recv() { boost_socket->async_receive_from( boost::asio::buf
class UDP_Receiver { public: udp_receiver((boost::asio::io_service& io_service) : idle_work_
我尝试使用 async_receive_from 方法来获取数据。但是当我开始时,程序不会等待超时或正在读取某些内容。我知道数据正在端口(wireshark)上传入。这可能是什么原因。我尝试使用来自
我有一个设置,多个对等方每 200 毫秒 (5fps) 广播一次 udp 数据包(包含图像)。 虽然接收本地流作为外部流在 Windows 下工作正常,但相同的代码(除了 Windows XP 中的
我正在尝试使用 Boost 库创建一个简单的异步接收器。我遵循了示例和书籍,这就是我到目前为止能够做到的: class networkUDPClient { public: utilityTr
基本上: void start_receive() { socket_.async_receive_from( boost::asio::buffer(recv_buf
我正在尝试使用 3 次握手建立异步连接。在代码的底部有一个 main 方法,它接受一个参数来确定它是充当客户端还是服务器。 如果它充当服务器,它会创建一个套接字并等待它接收到数据,然后调用回调函数 m
Boost asio 专门允许多个线程调用 io_service 上的 run() 方法。这似乎是创建多线程 UDP 服务器的好方法。但是,我遇到了一个问题,我正在努力寻找答案。 查看典型的 asyn
我有一个相当大的应用程序,可以在 Linux 上正常运行。我最近使用 VC2012 和 boost asio 1.52 在 Windows 7 上编译它并遇到了一个奇怪的问题: async_recei
我正在使用 boost::asio 创建服务器应用程序,特别是 UDP API。现在我从一个池中启动多个线程,使用 async_receive_from 监听单独的缓冲区。这在我主要开发的 Ubunt
我想创建一个自治线程,专门用于使用 boost 库 (asio) 从 UDP 套接字接收数据。这个线程应该是一个无限循环,由从 UDP 套接字接收到的一些数据触发。在我的应用程序中,我需要使用异步接收
int main() { boost::asio::io_service io_service; Worker ob1(&io_service); ob1.AsyncRead(); i
我已将 Boost 白天客户端教程中的 UDP 客户端代码修改为以下内容: class UDPClient { public: udp::socket* socket; udp::en
我是一名优秀的程序员,十分优秀!