TCP 扫描:意外的套接字异常
TCP Scan: Unexpected Socket Exceptions
我正在编写一个简单的 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
。我的 phone 检测到远程主机在线,这就是为什么我不明白为什么我得到 EHOSTUNREACH
。更奇怪的是,端口 22 - 在目标上未打开 - 获得 ECONNREFUSED
.
目标上实际打开的唯一端口是 FTP 端口 21(用 nmap
确认)。
我已经阅读了一些类似问题的答案。主要修复似乎是重新启动 phone 的 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");
我 运行ning 使用的设备是 Samsung Galaxy S2,我的目标是我的笔记本电脑,Macbook Pro 运行ning Fedora。两个设备都在同一个 WiFi 网络上。
我可以从我的笔记本电脑上检测到 运行 对 Android phone (192.168.0.3
) 的 nmap
扫描。绝对可以到达。
您能否提供有关您的测试的更多详细信息?
- 你的源设备是什么(android phone)?
- 您要到达并扫描哪个目的地?本地或外部网络上的计算机?
- 源设备和目标设备是否在同一网络(可能是 WiFi)上?
EHOSTUNREACH - 没有路由到主机应该说它是
ISO/OSI三层问题(不同私有IP网络的设备
彼此之间没有路由)
目标设备停机
ICMP protocol/ECHO 回复在两者之间的某处被阻止(或
源或目标设备上的防火墙)
ECONNREFUSED - 应该更清楚 - 此特定端口未在目标设备上打开
也许您可以将代码逻辑分为两部分:
- 检查设备是否启动并且 运行(PING - ICMP 协议)
- 然后进行端口扫描
- if isConnected == TRUE(端口打开)
否则(端口已关闭)
输出可能是:
- PING 成功 && isConnected == TRUE(设备已启动且端口已连接
打开)
- PING 成功 && isConnected == FALSE(设备已启动但端口已连接
关闭)
- PING 不成功 && isConnected == TRUE(可能是 ICMP protocol/ECHO 请求被阻止 - 设备已启动且端口已打开)
- PING 不成功 && isConnected == FALSE(设备可能是
DOWN 或 ICMP 被阻塞并且端口被关闭)
尝试一下。
谢谢。
我正在编写一个简单的 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
。我的 phone 检测到远程主机在线,这就是为什么我不明白为什么我得到 EHOSTUNREACH
。更奇怪的是,端口 22 - 在目标上未打开 - 获得 ECONNREFUSED
.
目标上实际打开的唯一端口是 FTP 端口 21(用 nmap
确认)。
我已经阅读了一些类似问题的答案。主要修复似乎是重新启动 phone 的 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");
我 运行ning 使用的设备是 Samsung Galaxy S2,我的目标是我的笔记本电脑,Macbook Pro 运行ning Fedora。两个设备都在同一个 WiFi 网络上。
我可以从我的笔记本电脑上检测到 运行 对 Android phone (192.168.0.3
) 的 nmap
扫描。绝对可以到达。
您能否提供有关您的测试的更多详细信息?
- 你的源设备是什么(android phone)?
- 您要到达并扫描哪个目的地?本地或外部网络上的计算机?
- 源设备和目标设备是否在同一网络(可能是 WiFi)上?
EHOSTUNREACH - 没有路由到主机应该说它是
ISO/OSI三层问题(不同私有IP网络的设备 彼此之间没有路由)
目标设备停机
ICMP protocol/ECHO 回复在两者之间的某处被阻止(或 源或目标设备上的防火墙)
ECONNREFUSED - 应该更清楚 - 此特定端口未在目标设备上打开
也许您可以将代码逻辑分为两部分:
- 检查设备是否启动并且 运行(PING - ICMP 协议)
- 然后进行端口扫描
- if isConnected == TRUE(端口打开) 否则(端口已关闭)
输出可能是:
- PING 成功 && isConnected == TRUE(设备已启动且端口已连接 打开)
- PING 成功 && isConnected == FALSE(设备已启动但端口已连接 关闭)
- PING 不成功 && isConnected == TRUE(可能是 ICMP protocol/ECHO 请求被阻止 - 设备已启动且端口已打开)
- PING 不成功 && isConnected == FALSE(设备可能是 DOWN 或 ICMP 被阻塞并且端口被关闭)
尝试一下。
谢谢。