codice di esempio:Boost.Asio sbagliato locale endpoint
#include "stdafx.h"
#include <boost/asio.hpp>
#include <winsock2.h>
#include <iostream>
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
boost::asio::io_service service;
auto sock_ = new boost::asio::basic_stream_socket<boost::asio::ip::tcp>(service);
if(sock_){
try {
boost::asio::ip::address_v4 ipa = boost::asio::ip::address_v4::from_string(argv[1]);
boost::asio::ip::basic_endpoint<boost::asio::ip::tcp> address(ipa, (unsigned short) atoi(argv[2]));
sock_->connect(address);
std::cout<<"connected. local address:"<<sock_->local_endpoint()<<" remote address:"<<sock_->remote_endpoint()<<std::endl;
} catch (const boost::system::system_error& e)
{
std::cout<<"ERROR:"<<e.what();
}
}
int dummy;
std::cin>>dummy;
return 0;
}
Ho 2 computer.
uscita dal computer A: connesso. indirizzo locale: XXXXXX remoto indirizzo: YYYYY (dove XXXXX e YYYY IP reali (IP uguale all'output ping))
output dal computer B: connesso. indirizzo locale: 127.0.0.1 remoto indirizzo: YYYYY (dove YYYY reale IP (IP stessi all'uscita ping))
Computer A e B hanno solo 1 NIC
perché ho avuto 127.0.0.1? Non riesco a stabilire una vera connessione da IP 127.0.0.1 a YYYY.
come risolverlo?
aggiornamento:
anche Windows Sockets ritorno 127.0.0.1 su un host problematico, vedi codice qui sotto
WSADATA wsaData;
auto iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
return 1;
}
SOCKET ConnectSocket;
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET) {
WSACleanup();
return 1;
}
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr(argv[1]);
clientService.sin_port = htons((unsigned short) atoi(argv[2]));
iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService));
if (iResult == SOCKET_ERROR) {
WSACleanup();
return 1;
}
struct sockaddr_in sin;
int addrlen = sizeof(sin);
if(getsockname(ConnectSocket, (struct sockaddr *)&sin, &addrlen) == 0 &&
sin.sin_family == AF_INET &&
addrlen == sizeof(sin))
{
char *ip = inet_ntoa(sin.sin_addr);
std::cout<<ip<<std::endl;
}
Aw. È piuttosto brutto. Avrei dovuto dirlo (come hai ottenuto il routing? Forse aiuterà le persone a diagnosticare il problema se hanno la stessa cosa) – sehe
"come hai realizzato il routing?" Continuo a indagarlo :)) – kain64b