Ich muss mit einem anderen Gerät in einem privaten Netzwerk über UDP kommunizieren. Ich bin neu in der Verwendung von Boost, aber basierend auf dem, was ich online suchte und auch den Tutorials auf der Boost-Website, kam ich unten Code .. Ich versuche derzeit, Daten von meinem eigenen Gerät zu senden und zu empfangen. Nur um den Test zu testen und den Code zu finalisieren.UDP-Kommunikation mit C++ Boost Asio
Frage: Ich kann keine Nachricht empfangen. Was vermisse ich?
#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;
}
** Anfänger Frage ** io_service.run(); Der Befehl wird nicht ausgeführt, da er auf die wait-Anweisung folgt. Es wird nur ausgeführt, bevor die Funktion beendet wird. Warum wird es überhaupt benötigt? – yath
Ich erklärte es. So ist die Dokumentation: [am Ende] (http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/overview/core/basics.html) und z.B. der allererste asynchrone Lernschritt http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/tutorial/tuttimer2.html. Der Punkt ist, obwohl Sie die Funktion 'wait' _named_, überhaupt nicht _wait_. Denn das wäre nicht "asynchron" – sehe