WSAStringToAddress失败

我正在尝试使用以下C ++代码从IPv4string地址填充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,但是我没有使用更新的地址转换function,因为我需要从Windows XP / Windows Server 2000起向后兼容。

有谁知道如何解决这个问题/我的代码有什么问题? 你可以给任何解决scheme表示赞赏:D

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

WSAStringToAddress()无法转换请求的地址时, WSAEINVAL失败。 不匹配的系列值不是WSAEINVAL错误发生的唯一途径。 正如@ChristianStieber所说,你正在使用类型转换来传递一个8位char[]字符串,其中需要一个16位的wchar_t*指针。 这显然是错误的。 你正在传递垃圾到WSAStringToAddress() ,它正在检测。

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

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

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

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

我在网上看到的例子将addrSize设置为sizeof(struct sockaddr_storage)。

这个链接有一个例子。

在我看来,这个评论并没有说这是这个错误的唯一可能的原因。

特别是,这条线打击我:

 (LPWSTR) "192.168.0.1", 

你正在采取一个8位字符串,只是把它投到宽版本。 你尝试使用L“192 ….”吗?