![](/img/trans.png)
[英]Permission refused when connecting to domain socket created by 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();
}
}
首先
acceptor.accept(this->sock, acceptor.local_endpoint(), errCode);
该文件说:
此功能用于接受从对等方到给定套接字的新连接,并另外提供远程对等方的端点。 该函数调用将一直阻塞,直到成功接受新连接或发生错误为止。
您...传递接受者的本地端点作为接收对等方的远程端点的端点(如果编译,我感到很惊讶)。 那没有什么意义。 我建议您不需要了解远程端点¹:
acceptor.accept(this->sock, errCode);
其次,您必须绑定到回送适配器:
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()
从套接字中获取它,除非该套接字无效(例如关闭)
²除非您实现一些时髦的路由/隧道逻辑,否则就很难做到
包含错误处理功能的自包含演示:
#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.