我正在尝试使用以下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 ….”吗?