我正在尝试使用以下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
答案 0 :(得分:6)
WSAStringToAddress()
在WSAEINVAL
无法翻译请求的地址时失败。不匹配的族值不是WSAEINVAL
错误发生的唯一方法。正如@ChristianStieber所说,您正在使用类型转换来传递一个8位char[]
字符串文字,其中需要一个16位wchar_t*
指针。这是完全错误的。您正在将垃圾传递给WSAStringToAddress()
,它正在检测到。
当将字符串文字传递给TEXT()
值时,您需要使用LPTSTR
宏,例如:
rc = WSAStringToAddress( TEXT("192.168.0.1"), ... );
否则,直接调用WSAStringToAddress()
的Unicode版本,并在字符串文字前添加L
前缀,使其成为wchar_t[]
而不是char[]
,例如:
rc = WSAStringToAddressW( L"192.168.0.1", ... );
答案 1 :(得分:0)
我在网上看到的例子将addrSize设置为sizeof(struct sockaddr_storage)。
this link有一个例子。
答案 2 :(得分:0)
在我看来,这条评论并未说明这是造成此错误的唯一可能原因。
特别是,这条线让我感到震惊:
(LPWSTR) "192.168.0.1",
您正在使用8位字符串并将其转换为宽版本。你尝试过使用L“192 ....”吗?