【问题标题】:Boost.asio server-client. Connect between 2 computersBoost.asio 服务器-客户端。连接两台电脑
【发布时间】:2013-12-10 20:25:30
【问题描述】:

我正在关注boost官网http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/tutorial/tutdaytime1.html的教程。

如果我在同一台机器上连接到“localhost”或“127.0.0.1”,程序运行良好。但是,如果我在具有相同网络的另一台计算机上运行客户端,则无法连接到服务器。为什么会这样?我需要做什么才能让客户端在另一个网络上运行?

错误:连接:无法建立连接,因为目标机器主动拒绝。

客户:

#include <iostream>
#include <boost/array.hpp>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

int main()
{
    try
    {
        boost::asio::io_service io_service;

        tcp::resolver resolver(io_service);

        char* serverName = "localhost";
        tcp::resolver::query query(serverName, "daytime");
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

        tcp::socket socket(io_service);
        while(true)
        {
            boost::asio::connect(socket, endpoint_iterator);

            for (;;)
            {
                boost::array<char, 128> buf;
                boost::system::error_code error;

                size_t len = socket.read_some(boost::asio::buffer(buf), error);

                if (error == boost::asio::error::eof)
                    break; // Connection closed cleanly by peer.
                else if (error)
                    throw boost::system::system_error(error); // Some other error.

                std::cout.write(buf.data(), len);
                std::cout <<"\n";
            }
        }
    }
    catch (std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }

    return 0;
}

服务器:

#include <iostream>
#include <string>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

int main()
{
    try
    {
        boost::asio::io_service io_service;

        tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13));

        for (;;)
        {
            tcp::socket socket(io_service);
            acceptor.accept(socket);

            std::string message = "This is the Server!";

            boost::system::error_code ignored_error;
            boost::asio::write(socket, boost::asio::buffer(message), ignored_error);
        }
    }
    catch (std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }

    return 0;
}

【问题讨论】:

  • 错误信息是什么?
  • 错误:连接:无法建立连接,因为目标机器主动拒绝。

标签: c++ networking boost-asio


【解决方案1】:

我猜你的问题可能是你返回第一个错误。 Resolving 为您提供了多个端点上的迭代器。您尝试其中的第一个,如果没有成功,您放弃而不是让迭代器继续运行。

再说一次,我绝不是 boost::asio 方面的专家,而且在其 TCP 世界中也远非专家,但 resolve 可能会返回多个端点(例如 IPv4 和 IPv6),并且可能只有其中一个无法解决. 对于测试,您可以自己创建端点,首先创建一个ip::address 对象,使用其from_string() 方法为其提供服务器地址(当然仅适用于您的本地网络),然后将其用于您的端点:

boost::asio::ip::address address;
address.from_string("the.servers.ip.here");
boost::asio::ip::tcp::endpoint endpoint(address, 13);
boost::asio::connect(socket, endpoint);

然后看看这是否有效。如果不是,那可能是服务器端的问题。

【讨论】:

    【解决方案2】:

    要在不同的网络上运行服务器和客户端,请让客户端连接到服务器的外部 IP 地址。这很明显,但外部 IP 地址不断变化,因此要解决此问题,您可以访问 www.noip.com 并创建一个链接到您的 IP 地址的名称。这种方式在客户端中你所要做的就是指定一个名称而不是一个 IP 地址。

    【讨论】:

    • 您刚刚回答了自己的问题吗?
    • 是的,对此感到抱歉。对于相同的网络连接,我只是将客户端连接到我的服务器计算机的内部 ip,它工作得很好。
    • 好吧,我仍然很困惑,但如果你的问题得到解决,你应该接受你自己的答案或我的答案,如果这是你为解决它所做的。如果您的问题仍然存在,您可能需要重新表述您的问题。
    【解决方案3】:

    很可能是防火墙问题,如果您使用 windows 作为服务器检查 windows 防火墙,如果您使用的是 linux,请检查 iptables。

    【讨论】:

      猜你喜欢
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多