कोड उदाहरण: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 कंप्यूटर है।
कंप्यूटर से आउटपुट ए: कनेक्ट। स्थानीय पता: XXXXXX रिमोट पता: YYYYY (जहां XXXXX और YYYY वास्तविक आईपी (पिंग आउटपुट के लिए आईपी))
कंप्यूटर से आउटपुट बी: कनेक्ट। स्थानीय पता: 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;
}
ओह। यह बहुत बुरा है। मुझे इसका उल्लेख करना चाहिए था (आपने रूटिंग कैसे प्राप्त की? शायद यह लोगों को इस मुद्दे का निदान करने में मदद करेगा यदि उनके पास एक ही बात है) – sehe
"आपने रूटिंग कैसे प्राप्त की?" मैं अभी भी इसकी जांच कर रहा हूं :)) – kain64b