繁体   English   中英

Boost.Asio错误的本地端点

[英]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台电脑。

  1. 计算机输出A:已连接。 本地地址:XXXXXX远程地址:YYYYY(其中XXXXX和YYYY真实IP(IP输出相同的IP))

  2. 计算机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,编译器故障并做出错误的假设。 这里的代码大大简化了:

住在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

实际上,当我连接到不在环回网络上的远程主机时,我得到:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM