首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图禁用IPv6会扰乱导入

试图禁用IPv6会扰乱导入
EN

Stack Overflow用户
提问于 2014-03-11 17:10:53
回答 1查看 523关注 0票数 1

我正在为“我的经典之作”创建一个应用程序,将“心跳”发送到外部网站,如果系统中存在IPv6和IPv4,我的应用程序希望发送IPv6心跳而不是IPv4心跳。

下面是我尝试过的(通过Google搜索):

代码语言:javascript
复制
Ipv6Element DisableIPv6 = null;
DisableIPv6.enabled = false;

这里的问题是,当我添加System.Net.Configuration导入时,来自.dll的其他部分代码将不再工作,因为我试图使用这种禁用IPv6的方法。

下面是一个.cs文件的示例,其中将心跳发送到外部网站( Minecraft.netClassiCube.net )。因为Minecraft.net只支持经典服务器的IPv4,所以软件工作正常,但是由于ClassiCube同时接受4和6,如果服务器运行的机器两者都有,那么只需要6,但我的软件还不支持IPv6。.cs文件是这里。(巴斯丁链接将于2周内到期)

如果是这样的话,我一直在尝试禁用IPv6,但现在我意识到IPv6有一天会取代IPv4,我知道现在需要支持IPv6,以免为时已晚。

我希望能够在应用程序中支持IPv6。如何修复我的代码以同时支持IPv4和6?

免责声明

实际上,这段代码是Visual C#,而不是java。该软件已在Visual 2013中创建。此程序用于托管“我的经典”服务器(而不是高级服务器)。许多人不相信该程序是用C#编写的,但我现在要说明这一点,这样就不会有任何混乱。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-11 20:49:46

在salt初始化下:

代码语言:javascript
复制
       // Dns lookup, to make sure that IPv4 is preferred for heartbeats
    static readonly Dictionary<string, IPAddress> TargetAddresses = new Dictionary<string, IPAddress>();
    static DateTime nextDnsLookup = DateTime.MinValue;
    static readonly TimeSpan DnsRefreshInterval = TimeSpan.FromMinutes(30);


    static IPAddress RefreshTargetAddress([NotNull] Uri requestUri)
    {
        if (requestUri == null) throw new ArgumentNullException("requestUri");

        string hostName = requestUri.Host.ToLowerInvariant();
        IPAddress targetAddress;
        if (!TargetAddresses.TryGetValue(hostName, out targetAddress) || DateTime.UtcNow >= nextDnsLookup)
        {
            try
            {
                // Perform a DNS lookup on given host. Throws SocketException if no host found.
                IPAddress[] allAddresses = Dns.GetHostAddresses(requestUri.Host);
                // Find a suitable IPv4 address. Throws InvalidOperationException if none found.
                targetAddress = allAddresses.First(ip => ip.AddressFamily == AddressFamily.InterNetwork);
            }
            catch (SocketException ex)
            {
                Logger.Log(LogType.Error,
                           "Heartbeat.RefreshTargetAddress: Error looking up heartbeat server URLs: {0}",
                           ex);
            }
            catch (InvalidOperationException)
            {
                Logger.Log(LogType.Warning,
                           "Heartbeat.RefreshTargetAddress: {0} does not have an IPv4 address!", requestUri.Host);
            }
            TargetAddresses[hostName] = targetAddress;
            nextDnsLookup = DateTime.UtcNow + DnsRefreshInterval;
        }
        return targetAddress;
    }

然后,在静态HttpWebRequest CreateRequest中,在request.UserAgent下插入

代码语言:javascript
复制
          if (uri.Scheme == "http")
        {
            request.Proxy = new WebProxy("http://" + RefreshTargetAddress(uri) + ":" + uri.Port);
        }

那应该有效,我没有办法测试它。希望您或其他人拥有ipv6,以便他们能够进行测试。顺便说一句,所有这些代码都是从fCraft中提取的,都归功于它们。http://www.fcraft.net

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22331777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档