📄 natchecker.java
字号:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: NatChecker.java
package org.gudy.azureus2.core3.ipchecker.natchecker;
import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdmin;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdminASN;
import com.aelitis.azureus.plugins.upnp.*;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.*;
import java.nio.ByteBuffer;
import java.util.Locale;
import java.util.Map;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.tracker.util.TRTrackerUtils;
import org.gudy.azureus2.core3.util.BDecoder;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.PluginManager;
// Referenced classes of package org.gudy.azureus2.core3.ipchecker.natchecker:
// NatCheckerServer
public class NatChecker
{
private static final LogIDs LOGID;
public static final int NAT_OK = 1;
public static final int NAT_KO = 2;
public static final int NAT_UNABLE = 3;
private int result;
private String additional_info;
private InetAddress ip_address;
public NatChecker(AzureusCore azureus_core, InetAddress bind_ip, int port, boolean http_test)
{
String check;
NatCheckerServer server;
UPnPMapping new_mapping;
String upnp_str;
additional_info = "";
check = (new StringBuilder()).append("azureus_rand_").append(String.valueOf((int)(Math.random() * 100000D))).toString();
if (port < 0 || port > 65535 || port == 6880)
{
result = 3;
additional_info = "Invalid port";
return;
}
try
{
server = new NatCheckerServer(bind_ip, port, check, http_test);
}
catch (Throwable e)
{
result = 3;
additional_info = (new StringBuilder()).append("Can't initialise server: ").append(Debug.getNestedExceptionMessage(e)).toString();
return;
}
PluginInterface pi_upnp = azureus_core.getPluginManager().getPluginInterfaceByClass(com/aelitis/azureus/plugins/upnp/UPnPPlugin);
new_mapping = null;
upnp_str = null;
if (pi_upnp != null)
{
UPnPPlugin upnp = (UPnPPlugin)pi_upnp.getPlugin();
UPnPMapping mapping = upnp.getMapping(true, port);
if (mapping == null)
{
new_mapping = mapping = upnp.addMapping("NAT Tester", true, port, true);
try
{
Thread.sleep(500L);
}
catch (Throwable e)
{
Debug.printStackTrace(e);
}
}
UPnPPluginService services[] = upnp.getServices();
if (services.length > 0)
{
upnp_str = "";
for (int i = 0; i < services.length; i++)
{
UPnPPluginService service = services[i];
upnp_str = (new StringBuilder()).append(upnp_str).append(i != 0 ? "," : "").append(service.getInfo()).toString();
}
}
}
server.start();
String urlStr = (new StringBuilder()).append("http://nettest.azureusplatform.com/").append(http_test ? "httptest" : "nattest").append("?port=").append(String.valueOf(port)).append("&check=").append(check).toString();
if (upnp_str != null)
urlStr = (new StringBuilder()).append(urlStr).append("&upnp=").append(URLEncoder.encode(upnp_str, "UTF8")).toString();
NetworkAdminASN net_asn = NetworkAdmin.getSingleton().getCurrentASN();
String as = net_asn.getAS();
String asn = net_asn.getASName();
if (as.length() > 0)
{
urlStr = (new StringBuilder()).append(urlStr).append("&as=").append(URLEncoder.encode(as, "UTF8")).toString();
urlStr = (new StringBuilder()).append(urlStr).append("&asn=").append(URLEncoder.encode(asn, "UTF8")).toString();
}
urlStr = (new StringBuilder()).append(urlStr).append("&locale=").append(MessageText.getCurrentLocale().toString()).toString();
String ip_override = TRTrackerUtils.getPublicIPOverride();
if (ip_override != null)
urlStr = (new StringBuilder()).append(urlStr).append("&ip=").append(ip_override).toString();
URL url = new URL(urlStr);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.connect();
ByteArrayOutputStream message = new ByteArrayOutputStream();
InputStream is = con.getInputStream();
byte data[] = new byte[1024];
int expected_length = -1;
do
{
int len = is.read(data);
if (len <= 0)
break;
message.write(data, 0, len);
if (expected_length == -1 && message.size() >= 4)
{
byte bytes[] = message.toByteArray();
ByteBuffer bb = ByteBuffer.wrap(bytes);
expected_length = bb.getInt();
message = new ByteArrayOutputStream();
if (bytes.length > 4)
message.write(bytes, 4, bytes.length - 4);
}
} while (expected_length == -1 || message.size() != expected_length);
Map map = BDecoder.decode(message.toByteArray());
int reply_result = ((Long)map.get("result")).intValue();
switch (reply_result)
{
case 0: // '\0'
byte reason[] = (byte[])(byte[])map.get("reason");
if (reason != null)
Logger.log(new LogEvent(LOGID, 3, (new StringBuilder()).append("NAT CHECK FAILED: ").append(new String(reason)).toString()));
result = 2;
additional_info = reason != null ? new String(reason, "UTF8") : "Unknown";
break;
case 1: // '\001'
result = 1;
byte reply[] = (byte[])(byte[])map.get("reply");
if (reply != null)
additional_info = new String(reply, "UTF8");
break;
default:
result = 3;
additional_info = "Invalid response";
break;
}
byte ip_bytes[] = (byte[])(byte[])map.get("ip_address");
if (ip_bytes != null)
try
{
ip_address = InetAddress.getByAddress(ip_bytes);
}
catch (Throwable e) { }
server.stopIt();
if (new_mapping != null)
new_mapping.destroy();
break MISSING_BLOCK_LABEL_1046;
Exception e;
e;
result = 3;
additional_info = (new StringBuilder()).append("Error: ").append(Debug.getNestedExceptionMessage(e)).toString();
server.stopIt();
if (new_mapping != null)
new_mapping.destroy();
break MISSING_BLOCK_LABEL_1046;
Exception exception;
exception;
server.stopIt();
if (new_mapping != null)
new_mapping.destroy();
throw exception;
}
public int getResult()
{
return result;
}
public InetAddress getExternalAddress()
{
return ip_address;
}
public String getAdditionalInfo()
{
return additional_info;
}
static
{
LOGID = LogIDs.NET;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -