繁体   English   中英

连接到域以使用Boost.Asio托管服务器

[英]Connecting to a domain to host a server with Boost.Asio

如何通过服务器连接到我的域,以便可以“托管”它?

我尝试更改下面的代码段以使IP与我的域名匹配,但是捕获到一个异常,指出提供了无效的参数,我认为我应该解析域名,获取IP并使用获得的IP,而不是下面的代码片段中的那个,但是似乎我正在连接到我的外部IP,并且这不能让我托管服务器,因为它说计算机主动拒绝了连接。

这是代码片段:

boost::asio::ip::tcp::acceptor acceptor(service, boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("192.168.1.3"), 8001));

那是完整的代码:

Main.cpp的

#include "Server.h"

#include <string>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>

int main()
{
    Server server;
    boost::thread([&server] {
        server.handleConnections();
    }).join();

    return 0;
}

Server.h

#ifndef SERVER_H
#define SERVER_H

#include <string>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>

class Server
{
private:
    boost::asio::io_service service;
    boost::asio::ip::tcp::socket sock;
protected:

public:
    Server() : service(), sock(service) {

    }

    ~Server() {

    }

    void handleConnections();
};

#endif

Server.cpp

#include "Server.h"

void Server::handleConnections() {
    boost::system::error_code err;
    try {
        boost::asio::ip::tcp::acceptor acceptor(service, boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("192.168.1.3"), 8001));
        std::cout << acceptor.local_endpoint(err) << std::endl;
        while (true) {
            sock = boost::asio::ip::tcp::socket(service);
            boost::system::error_code errCode;
            acceptor.accept(this->sock, acceptor.local_endpoint(), errCode);
            boost::asio::write(sock, boost::asio::buffer("Olá"), errCode);
        }
        this->sock.close();
    }
    catch (std::exception & e)
    {
        std::cout << e.what();
    }
}
  1. 首先

     acceptor.accept(this->sock, acceptor.local_endpoint(), errCode); 

    文件说:

    此功能用于接受从对等方到给定套接字的新连接,并另外提供远程对等方的端点。 该函数调用将一直阻塞,直到成功接受新连接或发生错误为止。

    您...传递接受者的本地端点作为接收对等方的远程端点的端点(如果编译,我感到很惊讶)。 那没有什么意义。 我建议您不需要了解远程端点¹:

     acceptor.accept(this->sock, errCode); 
  2. 其次,您必须绑定到回送适配器:

     boost::asio::ip::tcp::acceptor acceptor(service, boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("192.168.1.3"), 8001)); 

    这直接意味着您无法从网络²访问它。 将其更改为与NIC无关:

     tcp::acceptor acceptor(service, tcp::endpoint(ip::address(), 8001)); 

¹通常,以后可以使用socket_->remote_endpoint()从套接字中获取它,除非该套接字无效(例如关闭)

²除非您实现一些时髦的路由/隧道逻辑,否则就很难做到

UPDATE

包含错误处理功能的自包含演示:

生活在Coliru

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

class Server
{
    boost::asio::io_service service;
public:
    void handleConnections() 
    {
        using namespace boost::asio;

        boost::system::error_code err;

        try {
            ip::tcp::acceptor acceptor(service, ip::tcp::endpoint(ip::address(), 6768));

            std::cout << acceptor.local_endpoint(err) << std::endl;

            while (!err) {
                ip::tcp::socket sock(service);

                if (   !acceptor.accept(sock, err)
                    && !write(sock, buffer("Olá"), err)
                    && !sock.close(err))
                {
                    std::cout << "Error in connection: " << err << " " << err.message() << "\n";
                }
            }
        } catch (std::exception & e) {
            std::cout << e.what();
        }
    }
};

#include <boost/thread.hpp>

int main() {
    Server server;
    boost::thread([&server] { server.handleConnections(); }).join();
}

输出:

$ ./a.out& 
0.0.0.0:6768

$ while sleep 1; do nc 127.0.0.1 6768; done
OláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOláOlá

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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