Ce serveur udp boost ne fonctionne pas comme prévu.Pourquoi ce code asio boost ne fonctionne-t-il pas correctement?
Il est identique au serveur d'écho UDP bloquant SAUF pour un changement mineur. J'utilise une socket différente pour renvoyer la réponse, c'est-à-dire sock2. Maintenant, ce code fonctionne parfaitement si le client est sur la même machine que le serveur. Mais le moment où je lance ceci sur une machine différente, la réponse n'est pas reçue. Toutefois, si je change la socket d'envoi pour être sock plutôt que sock2 cela fonctionne sur les machines.
Une idée pourquoi ce serait? wireshark ne montre aucune erreur. Le client utilise un port source aléatoire, puis appelle recv_from sur le même port aléatoire. Le serveur renvoie la réponse au même numéro de port que celui sur lequel le client écoute.
#include <cstdlib>
#include <iostream>
#include <boost/asio.hpp>
using boost::asio::ip::udp;
enum { max_length = 1024 };
void server(boost::asio::io_service& io_service, short port)
{
udp::socket sock(io_service, udp::endpoint(udp::v4(), port));
udp::socket sock2(io_service, udp::endpoint(udp::v4(), 0));
for (;;)
{
char data[max_length];
udp::endpoint sender_endpoint;
size_t length = sock.receive_from(
boost::asio::buffer(data, max_length), sender_endpoint);
printf("Got data, sending response to %s:%d\n", sender_endpoint.address().to_string().c_str(), sender_endpoint.port());
sock2.send_to(boost::asio::buffer(data, length), sender_endpoint);
}
}
int main(int argc, char* argv[])
{
try
{
if (argc != 2)
{
std::cerr << "Usage: blocking_udp_echo_server <port>\n";
return 1;
}
boost::asio::io_service io_service;
using namespace std; // For atoi.
server(io_service, atoi(argv[1]));
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
Je ne vois rien de faux dans le code que vous avez posté. Similaire à votre [dernière question] (http://stackoverflow.com/questions/3571156/why-doesnt-this-boost-asio-code-work-with-this-python-client) en utilisant l'exemple de serveur UDP asynchrone, s'il vous plaît Postez votre code client. –
Il est identique, sauf qu'il ne fonctionne pas sur le réseau! en fait d'un PC Linux à une machine virtuelle Windows sur le même PC. Mais d'autres codes fonctionnent. – Matt