Unity Ping IPV6

unity的System.Net.NetworkInformation.Ping不能正常使用调用sendaysnc直接卡死主线程 timeout时间后回调PingCompletedEventArgs e.Reply = null所以只好使用Unity自带ping 自带的ping测试ip v6不能直接传ipv6地址 要通过dns路由获取host对应的地址

public class NetUtil
    {
        /// <summary>
        /// host to ip
        /// </summary>
        /// <returns></returns>
        public static string ResolveHostNameToIP(string host, out AddressFamily af)
        {
            af = AddressFamily.Unknown;
            IPAddress[] AddressList = null;
            try
            {
                AddressList = Dns.GetHostAddresses(host);
            }
            catch (SocketException)
            {
                AddressList = new IPAddress[] { };
            }
            foreach (var ip in AddressList)
            {
                af = ip.AddressFamily;
                //IPv4
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                {
                    byte[] ipb = ip.GetAddressBytes();
                    StringBuilder sb = new StringBuilder();
                    foreach (var b in ipb)
                    {
                        if (sb.Length > 0)
                        {
                            sb.Append(".");
                        }
                        sb.Append(b);
                    }
                    return sb.ToString();
                }
                //IPv6
                if (ip.AddressFamily == AddressFamily.InterNetworkV6)
                {
                    byte[] ipb = ip.GetAddressBytes();
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < ipb.Length; ++i)
                    {
                        if (i % 2 == 0)
                        {
                            if (sb.Length > 0)
                            {
                                sb.Append(":");
                            }
                        }
                        sb.Append(ipb[i].ToString("x2"));
                    }
                    return sb.ToString();
                }
            }
            af = AddressFamily.Unknown;
            return string.Empty;
        }
    }
public class UnityPing
    {
        private Ping _ping;
        public UnityPing(string host, float timeout, Action<float> callback)
        {
            AddressFamily af = AddressFamily.Unknown;
            var ip = NetUtil.ResolveHostNameToIP(host, out af);
            _ping = new Ping(ip);
            AppFacade.Instance.GetBaseManager<BaseManger>(ManagerName.BaseManger)
                .StartCoroutine(PingTimeOut(Time.unscaledTime, timeout, callback));
        }
        private IEnumerator PingTimeOut(float unscaledTime, float timeout, Action<float> callback)
        {
            while (true)
            {
                if (null == _ping)
                {
                    yield break;
                }
                if (!_ping.isDone)
                {
                    yield return Wait.ForEndOfFrame;
                }
                break;
            }
            callback(Time.unscaledTime - unscaledTime);
        }
        public void DestroyPing()
        {
            if (null != _ping)
            {
                _ping.DestroyPing();
                _ping = null;
            }
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容