- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 udp_server 类中创建了异步函数 start_receive() 和 start_send()。但是通过代码不会停止并等待“async_receive_from”行。这是我的代码;
class udp_server
{
public:
udp_server(boost::shared_ptr< boost::asio::io_service > io_service,
const std::string& host,
const std::string& port
) : io_service_(*io_service), socket_(*io_service, udp::endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 7777))
{
udp::resolver resolver(io_service_);
udp::resolver::query query(udp::v4(), host, port);
udp::resolver::iterator iter = resolver.resolve(query);
endpoint_ = *iter;
std::cout << "end point>>" << endpoint_ << std::endl;
//start_receive();
}
void start_receive()
{
std::cout << "Gotin>>start_receive" << std::endl;
//std::cout << "Gotin>>" << std::endl;
socket_.async_receive_from(
boost::asio::buffer(recv_buffer_), remote_endpoint_,
boost::bind(&udp_server::handle_receive, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
));
}
void handle_receive(const boost::system::error_code& error, std::size_t msg_len)
{
using namespace std;
std::cout << "Got>> handle_receive" << std::endl;
//size_t data_length = data.size();
//std::cout.write(recv_buffer_.data(), recv_buffer_.size());
if (!error || error == boost::asio::error::message_size)
{
//std::cout << "msg_len:" << msg_len << std::endl;
std::cout.write(recv_buffer_.data(), msg_len);
std::cout << ", " << msg_len << std::endl;
start_send(recv_buffer_.data(), msg_len);
recv_buffer_.assign(0);
start_receive();
}
}
void start_send(const std::string& msg, std::size_t msg_len)
{
socket_.async_send_to(boost::asio::buffer(msg, msg_len), remote_endpoint_,
boost::bind(&udp_server::handle_send, this, msg,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void handle_send(const std::string& msg/*message*/,
const boost::system::error_code& /*error*/,
std::size_t tx_size/*bytes_transferred*/)
{
std::cout << "send>" << msg << std::endl;
//std::cout << "size>" << tx_size << std::endl;
//std::cout << "send>" << msg << std::endl;
}
private:
boost::asio::io_service& io_service_;
udp::endpoint endpoint_;
udp::socket socket_;
udp::endpoint remote_endpoint_;
boost::array<char, 1000> recv_buffer_;
};
int main()
{
try
{
boost::shared_ptr< boost::asio::io_service > io_service(new boost::asio::io_service);
udp_server server(io_service, "localhost", "6666");
//boost::asio::io_service io_service;
//udp_server server(io_service);
//io_service.run();
boost::thread_group tgroup;
tgroup.create_thread( boost::bind(&udp_server::start_receive, &server));
tgroup.join_all();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
在控制台上,我打印了“Gotin>>start_receive”行,但代码突然终止。因为它应该接收一些字节才能在“socket_.async_receive_from(”线上接收到,但它没有。我从来没有在控制台上看到“Got>> handle_receive”。我错过了什么?
最佳答案
您应该将线程提供给 io_service.run()
,而不是 socket_.async_receive_from()
。
你的代码应该是这样的:
tgroup.create_thread([&]{ io_service->run(); }); // or bind(&io_service::run, io_service)
io_service.dispatch([&]{ server.start_receive(); }); // or bind(&udp_server::start_receive, &server)
tgroup.join_all();
附带说明 - 您不会将 io_service 存储到共享指针中。您的程序中没有共享所有权。
关于c++ - 无法从 socket_.async_receive_from 接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38786262/
对于通过 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
我是一名优秀的程序员,十分优秀!