wee*_*r44 4 c++ sockets windows ipv4
我正在尝试使用以下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 );
}
Run Code Online (Sandbox Code Playgroud)
失败的错误代码为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(),它正在检测到.
TEXT()在将字符串文字传递给LPTSTR值时,您需要使用宏,例如:
rc = WSAStringToAddress( TEXT("192.168.0.1"), ... );
Run Code Online (Sandbox Code Playgroud)
否则,WSAStringToAddress()直接调用Unicode版本,并L在字符串文字前面加上一个前缀,使其成为a wchar_t[]而不是a char[],例如:
rc = WSAStringToAddressW( L"192.168.0.1", ... );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4492 次 |
| 最近记录: |