0

当我尝试连接到我的服务器时,我的客户端在函数 WSAStringToAddress 期间失败并出现错误 10022,我认为问题在于我尝试从控制台参数获取 IPv6 地址。我的本地主机地址的控制台参数的格式是 ::1。

这是失败的功能:

WSAStringToAddress((LPWSTR)argv[1], AF_INET6, NULL, (SOCKADDR *)&server, &len)

这里是 server 和 len 变量的代码:

struct sockaddr_in6 server;
int len = sizeof(server);
memset( &server, 0, sizeof (server));
server.sin6_family = AF_INET6;
server.sin6_port = htons(PORT);

是的,我希望有人看到我犯的错误。

4

1 回答 1

1

错误 10022WSAEINVAL,这意味着您传递了无效的参数。这种情况下的问题是,在编译 Unicode 程序时,WSAStringToAddress需要一个宽字符 string,并且您将一个窄字符串转换为宽字符串。您在插入强制转换之前遇到的编译器错误应该已经引发了一个危险信号。

你有几个选择:

  • 将您的应用程序更改为非 Unicode(不推荐
  • 将您的main函数更改为wmain,它采用宽字符参数字符串
  • WSAStringToAddressA通过调用而不是显式使用窄 (ANSI) 版本WSAStringToAddress
  • 使用将字符串从窄转换为宽MultiByteToWideChar

在这种特殊情况下,我建议明确使用该WSAStringToAddressA函数,因为使用宽字符版本不会为该函数提供任何额外优势。

于 2013-01-16T23:33:48.770 回答