c++ - boost asio 绑定(bind) : bad file descriptor

标签 c++ boost network-programming boost-asio

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

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

我决定使用 boost-asio。

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

但我得到一个异常(exception):“绑定(bind):错误的文件描述符”

这是代码片段:

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();
}

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

最佳答案

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

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

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

关于c++ - boost asio 绑定(bind) : bad file descriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49148737/

相关文章:

tcp - 为什么TCP在快速重传之前要等待三个重复的ACK?

c - 绑定(bind)到两个本地 IP 失败

c++ - C++类成员指针

c++ - C++ 中的 offsetof 宏

c++ - 如何遍历有向图中的所有边并获取源+目标

c++ - 将文本标记为类型、字符串对

c++ - TCP WSASend 完成标准

c++ - 返回 std::shared_ptr 的 vector 是否安全?

c++ - 使用 Visual Studio 2012 编译 GLFW

c++ - 使用替代解析器 boost spirit 不佳的性能