2015-10-12 9 views
9

Codebeispiel:Boost.Asio falsch lokales Endpunkt

#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; 
} 

Ich habe 2 Computer.

  1. Ausgabe von Computer A: verbunden. lokale Adresse: XXXXXX remote Adresse: YYYYY (wo XXXXX und YYYY echte IPs (IPs gleichen Ping-Ausgang))

  2. Ausgang von Computer B: verbunden. lokale Adresse: 127.0.0.1 Fern Adresse: YYYYY (wobei YYYY echte IP (IP-Adressen gleich ping-Ausgabe))

Computer A und B haben nur 1 NIC
Warum bekam ich 127.0.0.1? Ich kann keine echte Verbindung von IP 127.0.0.1 zu YYYY herstellen.
wie man es repariert?
Update:
auch Windows Sockets 127.0.0.1 auf problematischen Host zurückkehren, siehe Code unten

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

Antwort

2

127.0.0.1 über reale NIC weitergeleitet wurde :) Verbindung erfolgreich von 127.0.0.1 zu Remote-IP wegen Routing: '(

+0

Aw. Das ist ziemlich schlecht. Ich hätte es erwähnen sollen (wie hast du das Routing erreicht? Vielleicht hilft es den Leuten, das Problem zu diagnostizieren, wenn sie das gleiche haben) – sehe

+0

"Wie hast du das Routing erreicht?" Ich untersuche es immer noch :)) – kain64b

1

Sie mischen APIs, Compiler Glitches und die falschen Annahmen. Hier ist der Code ist stark vereinfacht:

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"; 
    } 
} 

Auf der Online-Demo, die Ausgabe ist:

Connected 127.0.0.1:40468 -> 127.0.0.1:6767 
hello world 

der Tat, wenn ich zu einem Remote-Host-Verbindung nicht im Loopback - Netzwerk bekomme ich:

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

Ich bin nicht sicher, dass Sie die Loopback-Adresse dort bekommen würden, aber ich würde die Möglichkeit nicht ausschließen, dass Sie die tostring falsch machen.

Siehe

+0

Hallo, danke für die Antwort! Getestet Sie Code, Ausgabe ist: Connected 127.0.0.1:54182 -> 172.16.31.7:7900 aktuelle Hosthost IP ist: 172.20.10.137, Remote-IP ist: 172.16.31.7. Sa Ich habe Probleme – kain64b

+0

Nach ein paar Recherchen denke ich, dass Sie auf WinXP/2003 Server oder älter laufen? http://social.msdn.microsoft.com/Forums/en-US/9b280699-fa48-4461-8875-bb446b6ea48a/why-cant-we-connect-to-loopback-address-from-non-loopback-addresses- mehr forum = wfp – sehe

+0

Windows 7 professionelle Französisch, denkst du, ist es OS Problem? Ich habe Firewall/Antivirus dasselbe Ergebnis deaktiviert. – kain64b