2015-10-12 6 views
9

कोड उदाहरण:Boost.Asio गलत स्थानीय 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; 
} 

मैं 2 कंप्यूटर है।

  1. कंप्यूटर से आउटपुट ए: कनेक्ट। स्थानीय पता: XXXXXX रिमोट पता: YYYYY (जहां XXXXX और YYYY वास्तविक आईपी (पिंग आउटपुट के लिए आईपी))

  2. कंप्यूटर से आउटपुट बी: कनेक्ट। स्थानीय पता: 127.0.0.1 दूरस्थ पता: YYYYY (जहां YYYY असली आईपी (आईपी पिंग उत्पादन) के लिए एक ही)

कम्प्यूटर ए और बी है केवल 1 एनआईसी
क्यों मैं 127.0.0.1 मिल गया? मैं IP 127.0.0.1 से YYYY तक वास्तविक कनेक्शन नहीं बना सकता।
इसे कैसे ठीक करें?
अद्यतन:
भी खिड़कियों सॉकेट लौट समस्याग्रस्त मेजबान पर 127.0.0.1, आपको उन API, संकलक खामियों मिश्रण रहे हैं और गलत मान्यताओं बनाने नीचे

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

उत्तर

2

127.0.0.1 असली एनआईसी के माध्यम से रूट किया गया था :) कनेक्शन मार्ग की वजह से दूरदराज के आईपी को 127.0.0.1 से सफल रहा: '(

+0

ओह। यह बहुत बुरा है। मुझे इसका उल्लेख करना चाहिए था (आपने रूटिंग कैसे प्राप्त की? शायद यह लोगों को इस मुद्दे का निदान करने में मदद करेगा यदि उनके पास एक ही बात है) – sehe

+0

"आपने रूटिंग कैसे प्राप्त की?" मैं अभी भी इसकी जांच कर रहा हूं :)) – kain64b

1

कोड देखें। यहाँ कोड बहुत सरलीकृत है:

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

ऑनलाइन डेमो पर, उत्पादन होता है:

Connected 127.0.0.1:40468 -> 127.0.0.1:6767 
hello world 

दरअसल, जब मैं नहीं एक दूरस्थ होस्ट करने के लिए कनेक्ट लूपबैक नेटवर्क पर, मुझे मिलता है:

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

मुझे यकीन नहीं है कि आपको वहां लूपबैक पता मिलेगा, लेकिन मैं इस संभावना से इंकार नहीं कर सकता कि आप tostring गलत कर रहे हैं।

देखें

+0

हाय, responce के लिए धन्यवाद! परीक्षण कोड, आउटपुट है: कनेक्ट किया गया 127.0.0.1:54182 -> 172.16.31.7:7900 वर्तमान होस्टहोस्ट आईपी है: 172.20.10.137, रिमोट आईपी है: 172.16.31.7। Sa मुझे समस्या – kain64b

+0

कुछ शोध करना मेरा अनुमान है कि आप WinXP/2003 सर्वर या पुराने पर चल रहे हैं? http://social.msdn.microsoft.com/Forums/en-US/9b280699-fa48-4461-8875-bb446b6ea48a/why-cant-we-connect-to-loopback-address-from-non-loopback-addresses- अब और? मंच = wfp – sehe

+0

विंडोज 7 पेशेवर फ्रेंच, क्या आपको लगता है कि यह ओएस समस्या है? मैंने फ़ायरवॉल/एंटीवायरस को एक ही परिणाम अक्षम कर दिया। – kain64b

संबंधित मुद्दे