我在寫一個簡單的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");
設備I運行的是三星Galaxy S2,我瞄準我的筆記本電腦,一臺運行Fedora的Macbook Pro。這兩款設備都在同一個WiFi網絡上。
從我的筆記本電腦我可以檢測到並運行Android手機上的nmap
掃描(192.168.0.3
)。這絕對可以到達。
對於從未打開的端口獲取ECONNREFUSED有什麼好奇?這正是你應該期待的。 – EJP 2015-04-05 23:37:24
@EJP好奇的是,其他端口正在報告無法到達目的地。如果無法到達目的地,那麼將報告第一個錯誤,即每個端口。如果首先無法達到目標,則無法建立連接。拒絕連接意味着目標發送了一個'RST'標記的數據包來響應'SYN',IE:他已經到達。 – Juicy 2015-04-06 01:07:02