背景
很多时候我们配置程序的服务器连接的时候,不想IP被别人知道或者基于安全原因需要使用动态改变的IP,这个时候我们的配置就不能是IP了,当我们使用socket的时候缺需要使用IP连接,这样的话就需要一个好用的转化方法了。
转化
巨坑
一般来说下面这个方法是可以获取的到IP的,但是这个方法有个很坑的点,那就是这个方法是异步执行的,也就是说基本上还没解析出来就已经返回了,这个时候首先,你去获取IP肯定是不对的,另外一个大坑,甚至可以说是unreal的bug,就是你去使用GetResolvedAddress()的时候返回的是引用,而且是通过指针转的,关键这个指针还没有判空,所有你一去取,就出错。
ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->GetHostByName(TCHAR_TO_ANSI(*Domain))->GetResolvedAddress()
/**
* Returns a copy of the resolved address
*
* @return the resolved IP address
*/
virtual const FInternetAddr& GetResolvedAddress() const
{
return *Addr;
}
正确姿势
正确的做法是通过一个同步的接口获取ip的解析结果,而且获取结果的指针也是前面获取的,不会有什么问题,然后获取成功和失败可以通过ESocketErrors去判断。错误码表很长,我就不全贴了,基本上我们用第一个就可以啦,就看看是不是SE_NO_ERROR,是的话IP就可以用了。
ISocketSubsystem* SocketSubSystem = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM);
TSharedRef<FInternetAddr> Addr = SocketSubSystem->CreateInternetAddr(0, 0);
ESocketErrors SocketError = SocketSubSystem->GetHostByName(TCHAR_TO_ANSI(*Domain), *Addr);
/** All supported error types by the engine, mapped from platform specific values */
enum ESocketErrors
{
SE_NO_ERROR,
SE_EINTR,
SE_EBADF,
SE_EACCES,
SE_EFAULT,
SE_EINVAL,
SE_EMFILE,
SE_EWOULDBLOCK,
SE_EINPROGRESS,
SE_EALREADY,
SE_ENOTSOCK,
SE_EDESTADDRREQ,
SE_EMSGSIZE,
SE_EPROTOTYPE,
SE_ENOPROTOOPT,
SE_EPROTONOSUPPORT,
SE_ESOCKTNOSUPPORT,
SE_EOPNOTSUPP,