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.
Ausgabe von Computer A: verbunden. lokale Adresse: XXXXXX remote Adresse: YYYYY (wo XXXXX und YYYY echte IPs (IPs gleichen Ping-Ausgang))
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;
}
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
"Wie hast du das Routing erreicht?" Ich untersuche es immer noch :)) – kain64b