2015-10-12 18 views
9

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.

  1. uscita dal computer A: connesso. indirizzo locale: XXXXXX remoto indirizzo: YYYYY (dove XXXXX e YYYY IP reali (IP uguale all'output ping))

  2. 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; 
} 

risposta

2

127.0.0.1 è stato instradato via reale NIC :) collegamento riuscito da 127.0.0.1 IP remoto a causa di instradamento: '(

+0

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

+0

"come hai realizzato il routing?" Continuo a indagarlo :)) – kain64b

1

Stai miscelazione API, glitch compilatore e rendendo le ipotesi sbagliate. Ecco il codice notevolmente semplificato:

Live On Coliru

#include <boost/asio.hpp> 
#include <iostream> 
#include <string> 

int main(int argc, char* argv[]) 
{ 
    namespace ba = boost::asio; 
    using ba::ip::tcp; 

    ba::io_service service; 
    tcp::socket s(service); 

    if (argc<3) 
     return 255; 

    try { 
     auto it = tcp::resolver(service).resolve({argv[1], argv[2]}); 
     s.connect(*it); // first resolved value 

     std::cout << "Connected " << s.local_endpoint() << " -> " << s.remote_endpoint() << "\n"; 

     // demo write 
     ba::write(s, ba::buffer("hello world\n")); 
    } catch (const boost::system::system_error& e) { 
     std::cout << "ERROR:" << e.what() << "\n"; 
    } 
} 

sul demo on-line, l'output è:

Connected 127.0.0.1:40468 -> 127.0.0.1:6767 
hello world 

Anzi, quando mi collego a un host remoto non sulla rete di loopback, ottengo:

[email protected]:/tmp$ ./test serverbox 6767 
Connected 192.168.188.20:47338 -> 192.168.188.24:6767 

Non sono troppo sicuro che qui si otterrebbe l'indirizzo di loopback, ma non escluderei affatto la possibilità che si stia facendo il sbagliato.

Vedi

+0

Ciao, grazie per la risposta, hai testato il tuo codice, l'output è: Connesso 127.0.0.1:54182 -> 172.16.31.7:7900 IP dell'host host corrente è: 172.20.10.137, l'ip remoto è: 172.16.31.7. Sa mi problema – kain64b

+0

Facendo qualche ricerca, la mia ipotesi è che si esegue su server WinXP/2003 o precedente? http://social.msdn.microsoft.com/Forums/en-US/9b280699-fa48-4461-8875-bb446b6ea48a/why-cant-we-connect-to-loopback-address-from-non-loopback-addresses- più? forum = wfp – sehe

+0

windows 7 francese professionale, pensi che sia un problema del sistema operativo? Ho disabilitato firewall/antivirus stesso risultato. – kain64b