c++ boost::asio -是否可以绑定到本地设备(相当于SO_BINDTODEVICE)而不是本地地址?

pvabu6sv  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(154)

我想绑定到一个本地接口,如"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的等效操作?

55ooxyrt

55ooxyrt1#

是否可以使用boost::asio执行与SO_BINDTODEVICE等效的操作?
不,但你可以像以前一样使用这个选项。

if (setsockopt(socket.native_handle(), SOL_SOCKET, SO_BINDTODEVICE, static_cast<void*>(&ifr), sizeof(ifr)) < 0)

您也可以定义自己的自定义选项,使其“更漂亮”,但我可能只会这样做,如果这是某种程度上经常重复的代码。

相关问题