使用 boost::asio 和 std::wstring 解析网络节点

resolving network node using boost::asio and an std::wstring

本文关键字:网络 wstring 节点 std boost asio 使用      更新时间:2023-10-16

我正在使用Boost::Asio进行网络通信。 以下代码失败,并出现以下编译错误。

法典:

std::wstring hostName(L"myserver");
std::wstring portName(L"myport");
auto query = boost::asio::ip::udp::resolver::query(boost::asio::ip::udp::v4(), hostName, portName);

编译错误:

Error   1   error C2665: 'boost::asio::ip::basic_resolver_query<InternetProtocol>::basic_resolver_query' :
none of the 5 overloads could convert all the argument types    

我的问题:

    Boost::
  • Asio 是否只期望 ANSI 字符串 (std::string)?
  • 这是否意味着不支持具有非 ANSI 字符的主机名?
  • 还是我必须先将宽字符串转换为 UTF8?
  • 在后一种情况下,Boost::Asio 是否提供了标准方法来执行此操作,或者我可以使用自己的 ANSI/Unicode 转换例程?

目前在Windows上运行,使用Visual Studio 2013。

提前谢谢。

Boost::

Asio 是否只期望 ANSI 字符串 (std::string)? 它期望 std::string,但不一定是 ANSI,因为 std::string 可以存储 UTF-8。

这是否意味着不支持具有非 ANSI 字符的主机名? 我没有亲自尝试过,但由于这本质上是底层操作系统网络代码之上的包装器,我找不到任何不支持使用 UTF-8 的理由。

还是我必须先将宽字符串转换为 UTF8? 最有可能的是,是的,因为宽字符串格式仅由核心Windows API使用,而UTF-8则被包括Boost在内的其他所有人使用。

在后一种情况下,Boost::Asio 是否提供了标准方法来执行此操作,或者我可以使用自己的 ANSI/Unicode 转换例程? Boost 似乎不支持宽字符。只要使用特定于 Windows 的字符编码,就可以使用 Windows 提供的 COM 接口进行转换(MultiByteToWideChar、WideCharToMultiByte),也可以使用自己的例程。 如果已知你自己的例程是可靠/正确的,并且你尚未使用 COM,则可能需要坚持使用自己的例程,而不是向项目添加对 COM 的依赖关系。