[英]Boost.Asio wrong local 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台電腦。
計算機輸出A:已連接。 本地地址:XXXXXX遠程地址:YYYYY(其中XXXXX和YYYY真實IP(IP輸出相同的IP))
計算機B輸出:連接。 本地地址: 127.0.0.1遠程地址:YYYYY(其中YYYY為真IP(與ping輸出的IP相同))
計算機A和B只有1個NIC
為什么我得到了127.0.0.1? 我無法從IP 127.0.0.1到YYYY建立真正的連接。
怎么解決?
更新:
甚至Windows套接字在有問題的主機上返回127.0.0.1,請參閱下面的代碼
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;
}
127.0.0.1通過真實網卡路由:)連接成功從127.0.0.1到遠程ip因為路由:'(
你正在混合API,編譯器故障並做出錯誤的假設。 這里的代碼大大簡化了:
#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
實際上,當我連接到不在環回網絡上的遠程主機時,我得到:
sehe@desktop:/tmp$ ./test serverbox 6767
Connected 192.168.188.20:47338 -> 192.168.188.24:6767
我也不太清楚HWY你會得到回送地址那里,但我不會在所有的排除,你正在做的可能性tostring
錯誤。
看到
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.