1
UDPを介してプライベートネットワーク内の別のデバイスと通信する必要があります。私はブーストを使用するのは初めてですが、オンラインで検索した内容とBoostのWebサイトのチュートリアルに基づいて、私は下のコードを思いつきました。私は現在自分のデバイスからデータを送受信しようとしています。単体テストを行い、コードを完成させるだけです。C++ boost asioを使用したUDP通信
質問:メッセージを受け取ることができません。私は何が欠けていますか?
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include "boost/asio.hpp"
#include <thread>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#define SRVR_UDP_PORT 10251
#define CLNT_UDP_PORT 10252
boost::array<char, 1024> recv_buffer;
void Sender(std::string in)
{
boost::asio::io_service io_service;
boost::asio::ip::udp::socket socket(io_service);
boost::asio::ip::udp::endpoint remote_endpoint;
socket.open(boost::asio::ip::udp::v4());
remote_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address::from_string("192.168.1.64"), SRVR_UDP_PORT);
boost::system::error_code err;
socket.send_to(boost::asio::buffer(in.c_str(), in.size()), remote_endpoint, 0, err);
socket.close();
//int i =0;
printf("Sending Payload --- \n");
}
void handle_receive(const boost::system::error_code& error, size_t bytes_transferred)
{
std::cout << "Received: '" << std::string(recv_buffer.begin(), recv_buffer.begin()+bytes_transferred) << "'\n";
}
void Receiver()
{
while(1)
{
boost::asio::io_service io_service;
boost::asio::ip::udp::socket socket(io_service);
boost::asio::ip::udp::endpoint remote_endpoint;
//socket.open(boost::asio::ip::udp::v4());
boost::system::error_code err;
remote_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address::from_string("192.168.1.64"), CLNT_UDP_PORT);
socket.open(boost::asio::ip::udp::v4());
//https://stackoverflow.com/questions/26820215/boost-asio-udp-client-async-receive-from-calls-handler-even-when-there-are-no-in
socket.async_receive_from(boost::asio::buffer(recv_buffer),
remote_endpoint,
boost::bind(handle_receive,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
//socket.close();
}
int i = 0;
printf("Received Payload --- %d", i);
}
int main(int argc, char *argv[])
{
//std::thread s(Sender);
std::thread r(Receiver);
//s.join();
std::string input = argv[1];
printf("Input is %s\nSending it to Sender Function...\n", input.c_str());
Sender(input);
r.join();
return 0;
}
**初心者の質問** io_service.run();コマンドはwait文の後にあるので実行されません。関数が終了する直前にのみ実行されます。それはなぜ必要なのでしょうか? – yath
私はそれを説明しました。したがって、ドキュメントは次のようになります。[最下部に](http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/overview/core/basics.html)最初の非同期チュートリアルのステップhttp://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/tutorial/tuttimer2.html。ポイントは、あなたが関数 'wait'に名前をつけたとしても、まったく_wait_ではないということです。それは 'async'ではないからです – sehe