gpt4 book ai didi

c++ - WSAStringToAddress 失败

转载 作者:可可西里 更新时间:2023-11-01 13:58:13 34 4
gpt4 key购买 nike

我正在尝试使用以下 C++ 代码从 IPv4 字符串地址填充 sockaddr_in 结构:

// WSAStringToAddress
struct sockaddr_in sock;

int addrSize = sizeof( struct sockaddr_in );

memset( &sock, 0, addrSize );

sock.sin_family = AF_INET;

rc = WSAStringToAddress( (LPWSTR) "192.168.0.1",
AF_INET,
NULL,
(LPSOCKADDR) &sock,
&addrSize );

if ( rc != 0 )
{
rc = WSAGetLastError();

printf( "WSAStringToAddress: error=[%d]\n", rc );
}

它失败了,错误代码为 10022,即 WSAEINVAL。在 http://msdn.microsoft.com/en-us/library/windows/desktop/ms742214%28v=vs.85%29.aspx它指出当 sockaddr_in 的地址族未设置为 AF_INET 或 AF_INET6 时会出现此错误代码,我已经清楚地做到了这一点。

我在 Windows Server 2008 R2 SP1 上运行 Visual C++ 2008 Express Edition,但我没有使用较新的地址转换函数,因为我需要从 Windows XP/Windows Server 2000 开始向后兼容。

有谁知道如何解决这个问题/我的代码有什么问题吗?感谢您提供的任何解决方案:D

编辑:我发现使用 WSAStringToAddressA 允许使用 ASCII char 而不是 tchar

最佳答案

WSAStringToAddress() 在无法转换请求的地址时失败并返回 WSAEINVAL。不匹配的系列值并不是发生 WSAEINVAL 错误的唯一方式。正如@ChristianStieber 所述,您正在使用类型转换来传递 8 位 char[] 字符串文字,其中需要 16 位 wchar_t* 指针。那是完全错误的。您正在将垃圾传递给 WSAStringToAddress(),它会检测到这一点。

当将字符串文字传递给 LPTSTR 值时,您需要使用 TEXT() 宏,例如:

rc = WSAStringToAddress( TEXT("192.168.0.1"), ... );

否则,直接调用Unicode版本的WSAStringToAddress(),并在字符串字面量前面加上L前缀,使其成为wchar_t[] 而不是 char[],例如:

rc = WSAStringToAddressW( L"192.168.0.1", ... );

关于c++ - WSAStringToAddress 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11694312/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com