Windows文件WSAStringToAddress指出:

INT WSAAPI WSAStringToAddress(
  _In_     LPTSTR             AddressString,
  _In_     INT                AddressFamily,
  _In_opt_ LPWSAPROTOCOL_INFO lpProtocolInfo,
  _Out_    LPSOCKADDR         lpAddress,
  _Inout_  LPINT              lpAddressLength
);
AddressString _In_ 参数,而不是 _Inout_ 参数。我不清楚为什么该API会采用非const指针,并且由于我有一个const char*而导致编译失败。

我的第一个问题是,为什么WSAStringToAddress使用非常量指针?

我的第二个问题是,放弃常驻性是否安全? WSAStringToAddress会修改char*参数吗?

这里有更多的背景故事...由于现代版本的Visual Studio中已弃用了警告,因此我试图在WSAStringToAddress替换中使用inet_addr

这是一个带有answer provided by Petar Korponaić的问题中详述的相同问题。科尔波奈奇(Korponaić)遇到了同样的问题。其额外副本的原因:

int inet_pton(int af, const char *src, void *dst)
{
  struct sockaddr_storage ss;
  int size = sizeof(ss);
  char src_copy[INET6_ADDRSTRLEN+1];

  ZeroMemory(&ss, sizeof(ss));
  /* stupid non-const API */
  strncpy (src_copy, src, INET6_ADDRSTRLEN+1);
  src_copy[INET6_ADDRSTRLEN] = 0;

  if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0)
  ...
}

最佳答案

  • Windows是C API,因此定义为"Some string"的C字符串不是恒定的。 C++通过使它们不变来改变这种情况。
  • 是的,使用const_cast<LPTSTR>("my string").抛弃constness是完全安全的
  • 关于winapi - 为什么WSAStringToAddress使用非常量AddressString?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39952781/

    10-11 17:05