Android 即使端口未打开,套接字连接始终返回true(端口扫描) 问题:
我有一个FOR语句,它调用具有不同IP地址的方法(从10.0.0.1到10.0.0.255不等,因为我没有IP扫描器)。此方法是未来可调用的,并返回布尔值true或false。 该方法的功能基本上是创建一个套接字,使用给定的IP和端口+超时连接到此套接字,并根据给定的IP地址、端口是否打开返回true或false 我的计划: 我正在尝试检查连接到同一WIFI网络的设备是否有开放端口(SSH端口),这样我就可以在不知道其IP地址的情况下通过SSH连接到此设备。我的想法是获取Android设备的私有IP地址,检查其是否等于公共私有IP地址(例如10.0.0.*),并扫描其IP范围(从10.0.0.1-255)以打开SSH端口(22)Android 即使端口未打开,套接字连接始终返回true(端口扫描) 问题:,android,sockets,ssh,ip,port,Android,Sockets,Ssh,Ip,Port,我有一个FOR语句,它调用具有不同IP地址的方法(从10.0.0.1到10.0.0.255不等,因为我没有IP扫描器)。此方法是未来可调用的,并返回布尔值true或false。 该方法的功能基本上是创建一个套接字,使用给定的IP和端口+超时连接到此套接字,并根据给定的IP地址、端口是否打开返回true或false 我的计划: 我正在尝试检查连接到同一WIFI网络的设备是否有开放端口(SSH端口),这样我就可以在不知道其IP地址的情况下通过SSH连接到此设备。我的想法是获取Android设备的私有
待办事项:
socket.connect(新的InetSocketAddress(ip,端口),超时)之外,此功能正常工作代码>始终返回true。我试着查看它的代码,看看它为什么会这样做,但我没有找到答案。如果你知道当IP地址上的给定端口未打开时,如何让套接字返回false,请告诉我。提前谢谢
代码:
这里我调用套接字方法(portIsOpen
),如果它返回true,我将发送到该方法的IP地址附加到我的Stringbuilder可能的IP地址中。这样,我可以列出所有打开端口的IP地址,然后再连接到它们
//Initialisiert Variablen für den Port Prüfer
public StringBuilder possibleIPAddress = new StringBuilder("");
final ExecutorService es = Executors.newFixedThreadPool(50);
final int timeout = 500;
final List<Future<Boolean>> futures = new ArrayList<>();
//Code for querying IP Adress here.
//Checking all IP-Addresses from 10.0.0.1-10.0.0.255 for open SSH Port
String ip = "";
for (int x=1;x<=10;x++) {
ip = "10.0.0."+x;
//Should return true if port on IP-Address is open, but returns true everytime..help?
if (futures.add(portIsOpen(es, ip, 22, timeout))) {
possibleIPAddress.append(ip).append("\n");
}
es.shutdown();
}
//初始化插入变量für den Port Prüfer
public StringBuilder possibleIPAddress=新StringBuilder(“”);
final Executors Service es=Executors.newFixedThreadPool(50);
最终int超时=500;
最终列表期货=新的ArrayList();
//此处用于查询IP地址的代码。
//正在检查10.0.0.1-10.0.0.255之间的所有IP地址以打开SSH端口
字符串ip=“”;
对于(int x=1;x你的portIsOpen()
方法返回一个未来
,你永远不会得到它的结果,因此你的方法永远不会返回任何东西,因为它从未被调用。当且仅当未来
的结果为真
时,你需要将其添加到可能的IP地址列表中
注意:在出现异常的情况下,您也会泄漏套接字。请使用try with resources
语法来修复此问题。谢谢您的回答,但每次尝试时,它仍然返回true:System.out.println(futures.add(portIsOpen(es,ip,22,timeout)));
…这意味着该方法正在执行套接字,然后返回true,因此我得到的结果是no?。我确实指定了当且仅当结果为true,因为if(futures.add(portIsOpen(es,ip,22,timeout)))
与if(futures.add(portIsOpen(es,ip,22,timeout))==true相同
。您能帮助我吗?我将如何使用资源输入元素?我尝试了以下方法:try(Socket Socket=new Socket(Socket.connect(new InetSocketAddress(ip,port,timeout)){}
但它告诉我变量Socket可能尚未初始化。
public static Future<Boolean> portIsOpen(final ExecutorService es, final String ip, final int port, final int timeout) {
return es.submit(new Callable<Boolean>() {
@Override public Boolean call() {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ip, port), timeout);
socket.close();
return true;
} catch (Exception ex) {
return false;
}
}
});
}