我正在为“我的经典之作”创建一个应用程序,将“心跳”发送到外部网站,如果系统中存在IPv6和IPv4,我的应用程序希望发送IPv6心跳而不是IPv4心跳。
下面是我尝试过的(通过Google搜索):
Ipv6Element DisableIPv6 = null;
DisableIPv6.enabled = false;这里的问题是,当我添加System.Net.Configuration导入时,来自.dll的其他部分代码将不再工作,因为我试图使用这种禁用IPv6的方法。
下面是一个.cs文件的示例,其中将心跳发送到外部网站( Minecraft.net或ClassiCube.net )。因为Minecraft.net只支持经典服务器的IPv4,所以软件工作正常,但是由于ClassiCube同时接受4和6,如果服务器运行的机器两者都有,那么只需要6,但我的软件还不支持IPv6。.cs文件是这里。(巴斯丁链接将于2周内到期)
如果是这样的话,我一直在尝试禁用IPv6,但现在我意识到IPv6有一天会取代IPv4,我知道现在需要支持IPv6,以免为时已晚。
我希望能够在应用程序中支持IPv6。如何修复我的代码以同时支持IPv4和6?
免责声明
实际上,这段代码是Visual C#,而不是java。该软件已在Visual 2013中创建。此程序用于托管“我的经典”服务器(而不是高级服务器)。许多人不相信该程序是用C#编写的,但我现在要说明这一点,这样就不会有任何混乱。
发布于 2014-03-11 20:49:46
在salt初始化下:
// 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
https://stackoverflow.com/questions/22331777
复制相似问题