我正在为Minecraft Classic创建一个应用程序来发送" Heartbeats"如果系统上存在IPv6和IPv4,我的应用程序想要发送IPv6心跳而不是IPv4心跳。
以下是我尝试过的内容(通过Google搜索查看):
Ipv6Element DisableIPv6 = null;
DisableIPv6.enabled = false;
这里的问题是,当我添加System.Net.Configuration
导入时,我.dll的其他部分代码将不再起作用,因为我尝试使用这种禁用IPv6的方法。
以下是.cs文件的一个示例,其中心跳被发送到外部网站(Minecraft.net
或ClassiCube.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#编写的,但我现在要说的是,现在没有混乱了。
答案 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