我想绑定到一个本地接口,如"eth0"
,使用boost::asio
。
使用低级套接字接口的等效代码为:
const std::string ifc = "eth0";
struct ifreq ifr;
bzero(&ifr, sizeof(ifr));
memcpy(ifr.ifr_name, ifc.c_str(), ifc.length());
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, static_cast<void*>(&ifr), sizeof(ifr)) < 0)
{
throw std::runtime_error("bind to local interface failed");
}
但是,当我尝试将本地接口传递给boost::asio::ip::tcp::resolver
时,它无法解析:
using tcp = boost::asio::ip::tcp;
const std::string ifc = "eth0";
auto ctx = socket.get_executor();
tcp::resolver resolver(ctx);
tcp::resolver::results_type results = resolver.resolve(ifc, "");
这将抛出一个异常,描述为"Host not found (authoritative)"
根据错误消息的内容,它听起来确实像是试图将接口解析为主机地址。
是否可以使用boost::asio
来执行SO_BINDTODEVICE
的等效操作?
1条答案
按热度按时间55ooxyrt1#
是否可以使用boost::asio执行与SO_BINDTODEVICE等效的操作?
不,但你可以像以前一样使用这个选项。
您也可以定义自己的自定义选项,使其“更漂亮”,但我可能只会这样做,如果这是某种程度上经常重复的代码。