尝试禁用IPv6 Messes Up Imports

时间:2014-03-11 17:10:53

标签: c# ipv6 minecraft ipv4

我正在为Minecraft Classic创建一个应用程序来发送" Heartbeats"如果系统上存在IPv6和IPv4,我的应用程序想要发送IPv6心跳而不是IPv4心跳。

以下是我尝试过的内容(通过Google搜索查看):

Ipv6Element DisableIPv6 = null;
DisableIPv6.enabled = false;

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

以下是.cs文件的一个示例,其中心跳被发送到外部网站(Minecraft.netClassiCube.net。由于Minecraft.net仅为其Classic服务器支持IPv4,该软件工作正常,但由于ClassiCube同时接受4和6,如果服务器运行的机器同时使用,则只需6,但我的软件还不支持IPv6。.cs文件是{{3 ( Pastebin链接在2周内过期

如果是这种情况,我一直试图禁用IPv6,但现在我意识到IPv6有朝一日会取代IPv4,我知道我需要在为时已晚之前支持IPv6

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





声明

这段代码实际上 Visual C#,而不是java。该软件已在Visual Studio 2013中创建。此程序用于托管Minecraft Classic Server(非Premium)。很多人都不相信这个程序是用C#编写的,但我现在要说的是,现在没有混乱了。

1 个答案:

答案 0 :(得分:1)

在盐初始化下:

       // 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下,插入

          if (uri.Scheme == "http")
        {
            request.Proxy = new WebProxy("http://" + RefreshTargetAddress(uri) + ":" + uri.Port);
        }

这应该有用,我无法测试它。希望你或其他人有ipv6所以他们可以测试。所有这些代码基本上都是从fCraft中获取的,所有这些都归功于他们。 http://www.fcraft.net