提升 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 绑定:错误的文件描述符的主要内容,如果未能解决你的问题,请参考以下文章