提升 asio 绑定:错误的文件描述符

Posted

技术标签:

【中文标题】提升 asio 绑定:错误的文件描述符【英文标题】:boost asio bind: bad file descriptor 【发布时间】:2018-03-07 09:47:58 【问题描述】:

我正在创建多线程应用程序,它将作为“路由器”工作,但在应用程序层上。 该软件将在具有多个网络接口的多台主机上运行。

在我的应用程序中,一个线程运行服务器,它接受每个接口上的每个连接并将其传递给另一个工作线程,由后者决定是否转发消息以及应该使用哪个接口。

我决定使用 boost-asio。

总结一下:仅在服务器中传入消息(仅此处为读取功能),根据类型通过不同网关传出(仅发送功能)。网关应该始终连接到一个接口,因此我尝试使用绑定方法。

但我得到一个异常:“bind: Bad file descriptor”

这里是sn-p的代码:

try 

    MY_LOG(trace) << "Connecting on IFace" << routingConf->connections[interface].ipSource;
    boost::asio::io_service *svc = new boost::asio::io_service();
    this->socket = new boost::asio::ip::tcp::socket(*svc);
    boost::asio::ip::tcp::endpoint localEndpoint =
        ip::tcp::endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 0);
    boost::asio::ip::tcp::endpoint remoteEndpoint = ip::tcp::endpoint(
            boost::asio::ip::address::from_string("127.0.0.1"), port);
    this->socket->bind(localEndpoint);
    MY_LOG(trace) << "socket success";
    this->socket->connect(remoteEndpoint);
 catch (std::exception &e) 

    MY_LOG(fatal) << e.what();

我为本地和远程端点尝试了不同的设置。服务器已经在另一个线程中运行,如果我不执行绑定操作,它是从发送函数(这里不包括)获取发送的消息。

【问题讨论】:

我尝试使用相应的标准网络库:***.com/questions/14697963/… sockaddr_in localaddr = 0; localaddr.sin_family = AF_INET; localaddr.sin_addr.s_addr = inet_addr("127.0.0.1");绑定(this->sock, (sockaddr*)&localaddr, sizeof(localaddr));它毫无例外地工作。但我仍然对 asio 解决方案感兴趣。 编辑您的问题,而不是在 cmets 中漫无目的。此外,在您“引用”的替代方案中,您跳过了在 Asio 代码中错过的相同的基本步骤(SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);,即打开套接字) 另外,您的代码可能要简单得多。不要使用new(你肯定会泄露io_service)。您计划使用多少个io_service 实例?您将如何管理许多连接(因为您使用的是阻塞连接)?换句话说,在您着手重新发明负载平衡路由器之前,您是否尝试过通过simple tutorial example 工作? 我正在使用连接,因为我只想使用网关来发送数据。所以我有时会调用发送函数。要异步读取数据,我将使用服务器线程。无论如何感谢您的帮助 【参考方案1】:

socket::bind 在创建套接字但未打开时抛出错误文件描述。你使用了构造函数

basic_stream_socket(
boost::asio::io_service & io_service);

构造套接字而不打开它。 您应该在调用 bind 之前调用 open 方法,或者使用创建并打开套接字的套接字构造函数的重载版本之一。

【讨论】:

以上是关于提升 asio 绑定:错误的文件描述符的主要内容,如果未能解决你的问题,请参考以下文章

获取Boost deadline_timer原生文件描述符

异步读取 inotify 描述符失败

多次使用 socketpair 函数的文件描述符时出现“错误的文件描述符”错误

为啥我会收到错误的文件描述符错误?

c read() 导致错误的文件描述符错误

dup2 错误的文件描述符错误