TCP扫描:意外的套接字异常

时间:2015-04-05 21:43:10

标签: java android sockets tcp

我正在编写一个简单的TCP端口扫描程序。这是我的代码:

for (int port : portList) {
    Socket socket = new Socket();

    try {
        socket.connect(new InetSocketAddress(targetIP, port), 5000);

        // If we get to this point, port is open
        Log.d(DEBUG_TAG, "Port " + port + " open");

    } catch (Exception e) {
        Log.d(DEBUG_TAG, e.toString());
    } finally {
        // Try to close
        try {
            socket.close();
        } catch (Exception e) {}
    }
}

这是调试输出。我已经多次运行扫描并使用相同的端口ECONNREFUSED获得完全相同的输出,而其他EHOSTUNREACH

D/TCPSCAN﹕ java.net.SocketException: failed to connect to /192.168.0.10 (port 21) after 5000ms: isConnected failed: EHOSTUNREACH (No route to host)
D/TCPSCAN﹕ java.net.ConnectException: failed to connect to /192.168.0.10 (port 22) after 5000ms: isConnected failed: ECONNREFUSED (Connection refused)
D/TCPSCAN﹕ java.net.SocketException: failed to connect to /192.168.0.10 (port 23) after 5000ms: isConnected failed: EHOSTUNREACH (No route to host)
D/TCPSCAN﹕ java.net.SocketException: failed to connect to /192.168.0.10 (port 80) after 5000ms: isConnected failed: EHOSTUNREACH (No route to host)
D/TCPSCAN﹕ java.net.SocketException: failed to connect to /192.168.0.10 (port 443) after 5000ms: isConnected failed: EHOSTUNREACH (No route to host)

我正在运行的Android设备可以成功ping -c 1 -W 1 192.168.0.10。我的手机将远程主机检测为在线,这就是为什么我不明白为什么我会EHOSTUNREACH。更令人好奇的是,端口22(未在目标上打开)获得ECONNREFUSED

目标上实际打开的唯一端口是FTP端口21(通过nmap确认)。

我已经阅读了类似问题的一些答案。主要解决方案似乎是重新启动手机的WiFi连接,这对我来说并不起作用。

注意

为了清楚起见,我没有在这里发布我的整个代码,但我正在检查目标主机192.168.0.10是否在线:

Process process = runtime.exec("/system/bin/ping -c 1 -W 1 192.168.0.10");
// Wait until the process finishes and check exit code (0 for success)
int exitCode = process.waitFor();
if (exitCode == 0)
    Log.d(DEBUG_TAG, "Online");

我正在运行的设备是三星Galaxy S2,我正在瞄准我的笔记本电脑,一台运行Fedora的Macbook Pro。两个设备都在同一个WiFi网络上。

在我的笔记本电脑上,我可以在Android手机上检测并运行nmap扫描(192.168.0.3)。它绝对可以到达。

1 个答案:

答案 0 :(得分:1)

您能否提供有关测试的更多详细信息?

  • 您的源设备(Android手机)是什么?
  • 您想要到达和扫描的目的地是什么?本地或外部网络上的计算机?
  • 源设备和目标设备是否在同一网络上(可能是WiFi)?

EHOSTUNREACH - 没有到主持人的路线应该说它是

  • ISO / OSI第3层问题(不同专用IP网络上的设备) 没有相互路线)

  • 目标设备已关闭

  • ICMP协议/ ECHO回复在两者之间的某处被阻止(或 源或目标设备上的防火墙)

ECONNREFUSED - 应该更清楚 - 此特定端口未在目标设备上打开

也许您可以将代码逻辑分为两部分:

  1. 检查设备是否已启动并运行(PING - ICMP协议)
  2. 然后执行端口扫描
    • if isConnected == TRUE(端口打开)   其他(港口已关闭)
  3. 输出可能是:

    1. PING成功&& isConnected == TRUE(设备已启动且端口为 OPEN)
    2. PING成功&& isConnected == FALSE(设备已启动但端口为 CLOSED)
    3. PING不成功&& isConnected == TRUE(可能ICMP协议/ ECHO请求已被阻止 - 设备已启动且端口已打开)
    4. PING不成功&& isConnected == FALSE(设备可能是 DOWN或ICMP为BLOCKED,端口为CLOSED)
    5. 尝试尝试一下。

      谢谢。