forked from KNEMC/KLALB
KLALB2.3
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
package org.kne.cloud.network.scanner;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.Objects;
|
||||
|
||||
public class InetAddressRange {
|
||||
private InetAddress begin;
|
||||
private InetAddress end;
|
||||
private String beginHost;
|
||||
private String endHost;
|
||||
public InetAddressRange (String host) throws UnknownHostException{
|
||||
this(host,host);
|
||||
}
|
||||
public InetAddressRange (String beginhost,String endhost) throws UnknownHostException {
|
||||
beginHost=beginhost;
|
||||
endHost=endhost;
|
||||
InetAddress begin=InetAddress.getByName(beginhost);
|
||||
InetAddress end=InetAddress.getByName(endhost);
|
||||
checkIPRange(begin, end);
|
||||
this.begin = begin;
|
||||
this.end = end;
|
||||
}
|
||||
public String getBeginHost() {
|
||||
return beginHost;
|
||||
}
|
||||
public String getEndHost() {
|
||||
return endHost;
|
||||
}
|
||||
public InetAddressRange(InetAddress address) {
|
||||
this(address,address);
|
||||
}
|
||||
public InetAddressRange(InetAddress begin, InetAddress end) {
|
||||
super();
|
||||
checkIPRange(begin, end);
|
||||
this.begin = begin;
|
||||
this.end = end;
|
||||
}
|
||||
private void checkIPRange(InetAddress begin, InetAddress end) throws IllegalArgumentException {
|
||||
if(begin instanceof Inet4Address&&end instanceof Inet6Address)
|
||||
throw new IllegalArgumentException("begin is IPv4 but end is IPv6");
|
||||
|
||||
if(begin instanceof Inet6Address&&end instanceof Inet4Address)
|
||||
throw new IllegalArgumentException("begin is IPv6 but end is IPv4");
|
||||
}
|
||||
public InetAddress getBegin() {
|
||||
return begin;
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(begin, end);
|
||||
}
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
InetAddressRange other = (InetAddressRange) obj;
|
||||
return Objects.equals(begin, other.begin) && Objects.equals(end, other.end);
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return "InetAddressRange [begin=" + begin + ", end=" + end + "]";
|
||||
}
|
||||
public InetAddress getEnd() {
|
||||
return end;
|
||||
}
|
||||
public BigInteger getElementCount() {
|
||||
return new BigInteger(end.getAddress()).subtract(new BigInteger( begin.getAddress())).add(BigInteger.valueOf(1));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package org.kne.cloud.network.scanner;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.Objects;
|
||||
|
||||
public class PortRange {
|
||||
private int begin;
|
||||
public PortRange(int begin, int end) {
|
||||
super();
|
||||
checkRange(begin,end);
|
||||
this.begin = begin;
|
||||
this.end = end;
|
||||
}
|
||||
public PortRange(int port) {
|
||||
this(port,port);
|
||||
}
|
||||
private void checkRange(int begin2, int end2) {
|
||||
if(end2<begin2)
|
||||
throw new IllegalArgumentException("begin is bigger than end!");
|
||||
|
||||
}
|
||||
private int end;
|
||||
public int getBegin() {
|
||||
return begin;
|
||||
}
|
||||
public int getEnd() {
|
||||
return end;
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PortRange [begin=" + begin + ", end=" + end + "]";
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(begin, end);
|
||||
}
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
PortRange other = (PortRange) obj;
|
||||
return begin == other.begin && end == other.end;
|
||||
}
|
||||
public BigInteger getElementCount() {
|
||||
return BigInteger.valueOf(end).subtract(BigInteger.valueOf(begin)).add(BigInteger.valueOf(1));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,253 @@
|
||||
package org.kne.cloud.network.scanner;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Socket;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.LockSupport;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
import org.kne.cloud.network.ThreadTool;
|
||||
|
||||
public class TCPNetworkScanner implements Runnable {
|
||||
private BiConsumer<MultipurposeSocketAddress,Socket> consumer;
|
||||
private Consumer<Float>processConsumer;
|
||||
|
||||
public Consumer<Float> getProcessConsumer() {
|
||||
return processConsumer;
|
||||
}
|
||||
|
||||
public void setProcessConsumer(Consumer<Float> processConsumer) {
|
||||
this.processConsumer = processConsumer;
|
||||
}
|
||||
|
||||
private List<InetAddressRange> addressRanges = new ArrayList<>();
|
||||
|
||||
private List<PortRange> portRanges = new ArrayList<>();
|
||||
|
||||
public List<InetAddressRange> getAddressRanges() {
|
||||
return addressRanges;
|
||||
}
|
||||
|
||||
public List<PortRange> getPortRanges() {
|
||||
return portRanges;
|
||||
}
|
||||
|
||||
public BiConsumer<MultipurposeSocketAddress,Socket> getConsumer() {
|
||||
return consumer;
|
||||
}
|
||||
|
||||
public void setConsumer(BiConsumer<MultipurposeSocketAddress,Socket> consumer) {
|
||||
this.consumer = consumer;
|
||||
}
|
||||
|
||||
private BigInteger tot=new BigInteger("0");
|
||||
private BigInteger counter=new BigInteger("0");
|
||||
private int connectTimeout=500;
|
||||
private int soTimeout=3000;
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
ThreadPoolExecutor exc=(ThreadPoolExecutor) Executors.newFixedThreadPool(8192,new ThreadFactory() {
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
return ThreadTool.makeVThreadIfSupport("端口扫描线程", r);
|
||||
}
|
||||
});
|
||||
BigInteger bip=new BigInteger("0");
|
||||
for (Iterator<PortRange> iterator = portRanges.iterator(); iterator.hasNext();) {
|
||||
PortRange portRange = (PortRange) iterator.next();
|
||||
bip=bip.add(portRange.getElementCount());
|
||||
}
|
||||
BigInteger bia=new BigInteger("0");
|
||||
for (Iterator<InetAddressRange> iterator = addressRanges.iterator(); iterator.hasNext();) {
|
||||
InetAddressRange inetAddressRange = (InetAddressRange) iterator.next();
|
||||
bia=bia.add(inetAddressRange.getElementCount());
|
||||
}
|
||||
tot=bip.multiply(bia);
|
||||
|
||||
ReentrantLock counterlock=new ReentrantLock();
|
||||
counter=new BigInteger("0");
|
||||
|
||||
|
||||
counterlock.lock();
|
||||
try {
|
||||
if(processConsumer!=null) {
|
||||
BigDecimal bdt=new BigDecimal(tot);
|
||||
BigDecimal bdc=new BigDecimal(counter);
|
||||
float fp=bdc.divide(bdt, 8, BigDecimal.ROUND_HALF_UP).floatValue()*100;
|
||||
processConsumer.accept(fp);
|
||||
}
|
||||
}finally {
|
||||
counterlock.unlock();
|
||||
}
|
||||
|
||||
try {
|
||||
for (Iterator<PortRange> iterator = portRanges.iterator(); iterator.hasNext();) {
|
||||
PortRange portRange = (PortRange) iterator.next();
|
||||
int curport = portRange.getBegin();
|
||||
while (curport <= portRange.getEnd()) {
|
||||
|
||||
for (Iterator<InetAddressRange> iterator2 = addressRanges.iterator(); iterator2.hasNext();) {
|
||||
InetAddressRange inetAddressRange = (InetAddressRange) iterator2.next();
|
||||
|
||||
byte[]endarr=inetAddressRange.getEnd().getAddress();
|
||||
byte[] curr = inetAddressRange.getBegin().getAddress();
|
||||
while (compareIPAddress(curr,endarr)) {
|
||||
|
||||
int curport0=curport;
|
||||
InetAddress currAddress=pga(curr);
|
||||
|
||||
while( exc.getQueue().size()>1000) {
|
||||
LockSupport.parkNanos(1000000);
|
||||
}
|
||||
exc.execute(()->{
|
||||
|
||||
|
||||
MultipurposeSocketAddress mpsa;
|
||||
if (inetAddressRange.getBeginHost() != null&&currAddress.equals(inetAddressRange.getBegin())) {
|
||||
mpsa = new MultipurposeSocketAddress(inetAddressRange.getBeginHost(), curport0);
|
||||
}else if (inetAddressRange.getEndHost() != null&&currAddress.equals(inetAddressRange.getEnd())) {
|
||||
mpsa = new MultipurposeSocketAddress(inetAddressRange.getEndHost(), curport0);
|
||||
} else {
|
||||
mpsa = new MultipurposeSocketAddress(currAddress.getHostAddress(),
|
||||
curport0);
|
||||
}
|
||||
Socket s = null;
|
||||
try {
|
||||
s=new Socket();
|
||||
InetSocketAddress isa=new InetSocketAddress(currAddress, curport0);
|
||||
//System.out.println(isa);
|
||||
s.connect(isa,connectTimeout);
|
||||
s.setSoTimeout(soTimeout);
|
||||
|
||||
acceptMultipurposeSocketAddress(mpsa, s);
|
||||
} catch (Exception e) {
|
||||
|
||||
acceptMultipurposeSocketAddress(mpsa, null);
|
||||
} finally {
|
||||
if (s != null)
|
||||
try {
|
||||
s.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
counterlock.lock();
|
||||
try {
|
||||
counter=counter.add(BigInteger.valueOf(1));
|
||||
if(processConsumer!=null) {
|
||||
BigDecimal bdt=new BigDecimal(tot);
|
||||
BigDecimal bdc=new BigDecimal(counter);
|
||||
float fp=bdc.divide(bdt, 8, BigDecimal.ROUND_HALF_UP).floatValue()*100;
|
||||
processConsumer.accept(fp);
|
||||
}
|
||||
}finally {
|
||||
counterlock.unlock();
|
||||
}
|
||||
});
|
||||
increaceIPAddress(curr);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(10);
|
||||
} catch (InterruptedException e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
|
||||
curport++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}finally {
|
||||
exc.shutdown();
|
||||
try {
|
||||
exc.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private InetAddress pga(byte[] curr) {
|
||||
try {
|
||||
return InetAddress.getByAddress(curr);
|
||||
} catch (UnknownHostException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean compareIPAddress(byte[] curr, byte[] endarr) {
|
||||
|
||||
return new BigInteger(curr).compareTo(new BigInteger(endarr))<=0;
|
||||
}
|
||||
|
||||
private void increaceIPAddress(byte[] curr) {
|
||||
System.arraycopy( new BigInteger(curr).add(BigInteger.valueOf(1)).toByteArray(), 0, curr, 0, curr.length); ;
|
||||
}
|
||||
|
||||
protected void acceptMultipurposeSocketAddress(MultipurposeSocketAddress scanned, Socket s) {
|
||||
|
||||
consumer.accept(scanned,s);
|
||||
}
|
||||
|
||||
public int getConnectTimeout() {
|
||||
return connectTimeout;
|
||||
}
|
||||
|
||||
public void setConnectTimeout(int connectTimeout) {
|
||||
this.connectTimeout = connectTimeout;
|
||||
}
|
||||
|
||||
public int getSoTimeout() {
|
||||
return soTimeout;
|
||||
}
|
||||
|
||||
public void setSoTimeout(int soTimeout) {
|
||||
this.soTimeout = soTimeout;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public TCPNetworkScanner(int connectTimeout, int soTimeout) {
|
||||
super();
|
||||
this.connectTimeout = connectTimeout;
|
||||
this.soTimeout = soTimeout;
|
||||
}
|
||||
|
||||
public TCPNetworkScanner() {
|
||||
// TODO 自动生成的构造函数存根
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws UnknownHostException {
|
||||
TCPNetworkScanner tcn = new TCPNetworkScanner();
|
||||
tcn.getPortRanges().add(new PortRange(25565));
|
||||
tcn.getPortRanges().add(new PortRange(34000, 38000));
|
||||
tcn.getAddressRanges().add(new InetAddressRange("192.168.0.1","192.168.1.255"));
|
||||
tcn.setConsumer((scanned,s) -> {
|
||||
System.out.println(scanned);
|
||||
});
|
||||
tcn.setProcessConsumer((f)->{System.out.println(f);
|
||||
});
|
||||
|
||||
tcn.run();
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user