【问题标题】:how to handle local and public ip using boost::asio::ip::tcp::resolver如何使用 boost::asio::ip::tcp::resolver 处理本地和公共 ip
【发布时间】:2013-12-13 08:43:26
【问题描述】:

我有以下 3 个 eth:

eth0 inet 地址:10.105.159.146 广播:10.105.159.255 掩码:255.255.254.0 inet6 地址:fe80::a00:27ff:fe11:84e1/64 eth1 inet 地址:192.168.56.102 广播:192.168.56.255 掩码:255.255.255.0 inet6 地址:fe80::a00:27ff:fe5e:8a5c/64 lo inet 地址:127.0.0.1 掩码:255.0.0.0 inet6 地址::::1/128 范围:主机

这是我的代码如下:

server::server(const std::string& address, const std::string& port): io_service_(),
            signals_(io_service_),
            acceptor_(io_service_)
        {

            signals_.add(SIGINT);
            signals_.add(SIGTERM);
           #if defined(SIGQUIT)
            signals_.add(SIGQUIT);
           #endif // defined(SIGQUIT)
            signals_.async_wait(boost::bind(&server::handle_stop, this));

            boost::asio::ip::tcp::resolver resolver(io_service_);            
            boost::asio::ip::tcp::resolver::query query(address, port);
            boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);

            acceptor_.open(endpoint.protocol());
            acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
            acceptor_.bind(endpoint);
            acceptor_.listen();
            start_accept();
        }

我需要传入什么地址

boost::asio::ip::tcp::resolver::query query(**address**, port); 

这样客户端就可以使用 192.168.56.102 或 10.105.159.146 两个 IP 进行连接

目前如果我正在运行

server s("127.0.0.1", "1025");       //lo
server s("192.168.56.102", "1025"); //eth1
server s("10.105.159.146", "1025"); //eth0

这都属于同一台机器,所以我应该如何运行我的服务器或我可以做哪些更改,以便客户端可以访问以上任何 IP 请求。

【问题讨论】:

  • 尝试 0.0.0.0 作为 IP 地址
  • 您需要 INADDR_ANY(绑定到所有地址)或分别监听多个套接字。您不需要解析器,它将名称转换为地址,并且您已经拥有所需的所有地址。仅根据协议和端口号构建端点。
  • 感谢 bopah,通过将 ip 设置为 0.0.0.0 为我工作。

标签: c++ sockets boost tcp


【解决方案1】:

将地址设置为“0.0.0.0”以接受所有 IPV4 地址。或者您可以简单地替换:

boost::asio::ip::tcp::resolver resolver(io_service_);            
boost::asio::ip::tcp::resolver::query query(address, port);
boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);

与:

boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port);

请注意,在上面的行中,端口是unsigned short 而不是string

【讨论】:

  • 感谢大家的快速响应,将 IP 设置为 0.0.0.0 解决了我作为 bopah 的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 2018-06-08
相关资源
最近更新 更多