【发布时间】: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();
}
我为本地和远程端点尝试了不同的设置。服务器已经在另一个线程中运行,如果我不执行绑定操作,它是从发送函数(这里不包括)获取发送的消息。
【问题讨论】:
-
我尝试使用相应的标准网络库:stackoverflow.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 工作? -
我正在使用连接,因为我只想使用网关来发送数据。所以我有时会调用发送函数。要异步读取数据,我将使用服务器线程。无论如何感谢您的帮助
标签: c++ boost network-programming boost-asio