Thread "extern" beenden

freehawk

Mitglied
Hallo zusammen,

ich versuche mittels der Library pcap4j die MAC Adresse einer IP Adresse zu lesen. Nun habe ich das Problem, dass vor allem wenn die IP Adresse aus irgendwelchen Gründen nicht erreichbar ist, die Funktion der Klasse zwar beendet wird mit der RunTime Exception aber ein Thread stehen bleibt, den ich nicht beenden kann.

Man sieht ja in der Klasse, die ich geschrieben habe, dass ich dort versuche den Thread zu beenden, das hat aber keine Auswirkung.

Wenn ich anschließend extern alle Threads ausgeben lassen sehe ich folgendes Ergebnis:
Thread: Thread[pool-10-thread-1,5,main] : state: RUNNABLE

Wenn ich versuche den Thread zu interrupten passiert nichts, wenn ich ihn versuche zu stoppen geschieht auch nichts.

Hat mir hierzu jemand einen Tipp wie ich das lösen könnte, damit ich die Threads am besten irgendwie beenden kann oder zumindest anschließend aufräumen kann.

Danke

Gruß
Markus



[CODE lang="java" title="Klasse"]import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.pcap4j.core.BpfProgram.BpfCompileMode;
import org.pcap4j.core.NotOpenException;
import org.pcap4j.core.PacketListener;
import org.pcap4j.core.PcapHandle;
import org.pcap4j.core.PcapNativeException;
import org.pcap4j.core.PcapNetworkInterface;
import org.pcap4j.core.PcapNetworkInterface.PromiscuousMode;
import org.pcap4j.core.Pcaps;
import org.pcap4j.packet.ArpPacket;
import org.pcap4j.packet.EthernetPacket;
import org.pcap4j.packet.Packet;
import org.pcap4j.packet.namednumber.ArpHardwareType;
import org.pcap4j.packet.namednumber.ArpOperation;
import org.pcap4j.packet.namednumber.EtherType;
import org.pcap4j.util.ByteArrays;
import org.pcap4j.util.MacAddress;

public class SendArpRequest
{
private static final String COUNT_KEY = SendArpRequest.class.getName() + ".count";
private static int COUNT;
private static final String READ_TIMEOUT_KEY = SendArpRequest.class.getName() + ".readTimeout";
private static int READ_TIMEOUT; // [ms]
private static final String SNAPLEN_KEY = SendArpRequest.class.getName() + ".snaplen";
private static int SNAPLEN; // [bytes]

private String sourceIP = "";

private MacAddress sourceMac = MacAddress.getByName( "fe:00:01:02:03:04" );
private static MacAddress resolvedAddr = null;
private String destinationIP = "";

private Debug debug;
private ConfigRead config;

public SendArpRequest( Debug d, ConfigRead c, String sourceIP, String sourceMac )
{
this.debug = d;
this.config = c;
this.sourceIP = sourceIP;
this.sourceMac = MacAddress.getByName( sourceMac );

COUNT = Integer.getInteger( COUNT_KEY, config.getArpCount() );
READ_TIMEOUT = Integer.getInteger( READ_TIMEOUT_KEY, config.getArpTimeout() ); // [ms]
SNAPLEN = Integer.getInteger( SNAPLEN_KEY, config.getArpPacketSize() ); // [bytes]

debug.print( 2, "ARP Objekt initialisiert mit SourceIP: " + sourceIP + " und Source Mac: " + sourceMac );
}

public String searchMacAddress( String destinationIP ) throws RuntimeException
{
debug.print( 2, "Suche nach Macadresse für: " + destinationIP );

String erg = "";
Boolean state = true;

this.destinationIP = destinationIP;
resolvedAddr = null;

/*
System.out.println(COUNT_KEY + ": " + COUNT);
System.out.println(READ_TIMEOUT_KEY + ": " + READ_TIMEOUT);
System.out.println(SNAPLEN_KEY + ": " + SNAPLEN);
System.out.println("\n");
*/

PcapNetworkInterface nif;

try
{
nif = Pcaps.getDevByAddress( InetAddress.getByName( this.sourceIP ) );
}
catch( Exception e )
{
debug.print( 1, "Source Netzwerk Interface nicht gefunden: " + e.getMessage() );
return erg;
}

if( nif == null )
{
debug.print( 1, "Source Netzwerk Interface nicht gefunden!" );
return erg;
}

debug.print( 2, "Suche über folgendes Inerface: " + nif.getName() + " (" + nif.getDescription() + ")" );

PcapHandle handle = null;
PcapHandle sendHandle = null;
ExecutorService pool = null;

try
{
handle = nif.openLive( SNAPLEN, PromiscuousMode.PROMISCUOUS, READ_TIMEOUT );
sendHandle = nif.openLive( SNAPLEN, PromiscuousMode.PROMISCUOUS, READ_TIMEOUT );
pool = Executors.newSingleThreadExecutor();

handle.setFilter( "arp and src host " + destinationIP + " and dst host " + this.sourceIP + " and ether dst " + Pcaps.toBpfString( this.sourceMac ), BpfCompileMode.OPTIMIZE );

PacketListener listener = new PacketListener()
{
public void gotPacket( Packet packet )
{
if( packet.contains( ArpPacket.class ))
{
ArpPacket arp = packet.get( ArpPacket.class );
if( arp.getHeader().getOperation().equals( ArpOperation.REPLY ))
{
SendArpRequest.resolvedAddr = arp.getHeader().getSrcHardwareAddr();
}
}

debug.print( 3, "Empfangenes Packet: " + packet );

}
};

Task t = new Task( handle, listener );
pool.execute( t );

ArpPacket.Builder arpBuilder = new ArpPacket.Builder();
try
{
arpBuilder
.hardwareType( ArpHardwareType.ETHERNET )
.protocolType( EtherType.IPV4 )
.hardwareAddrLength( (byte)MacAddress.SIZE_IN_BYTES )
.protocolAddrLength( (byte)ByteArrays.INET4_ADDRESS_SIZE_IN_BYTES )
.operation( ArpOperation.REQUEST )
.srcHardwareAddr( this.sourceMac )
.srcProtocolAddr( InetAddress.getByName( this.sourceIP ))
.dstHardwareAddr( MacAddress.ETHER_BROADCAST_ADDRESS )
.dstProtocolAddr( InetAddress.getByName( destinationIP ));
}
catch( UnknownHostException e )
{
debug.print( 1, "Fehler beim Bau des ARP Pakets: " + e.getMessage() );
return erg;
}

EthernetPacket.Builder etherBuilder = new EthernetPacket.Builder();
etherBuilder.dstAddr( MacAddress.ETHER_BROADCAST_ADDRESS )
.srcAddr( this.sourceMac )
.type( EtherType.ARP )
.payloadBuilder( arpBuilder )
.paddingAtBuild( true );

for( int i = 0; i < COUNT; i++ )
{
Packet p = etherBuilder.build();

debug.print( 3, "Gesendetes Packet: " + p );

sendHandle.sendPacket(p);

try
{
Thread.sleep( 1000 );
}
catch( InterruptedException e )
{
break;
}
}

debug.print( 2, "Pakete gesendet" );

int i = 0;

while( true )
{
if( resolvedAddr != null )
{
break;
}

i = i + 1;

if( i >= 10 )
{
pool.shutdown();
pool.shutdownNow();
throwRuntimeException();
}

try
{
Thread.sleep( 100 );
}
catch( InterruptedException e )
{
break;
}
}
}
catch( RuntimeException re )
{
debug.print( 1, "Runtime Error bei ARP Abfrage: " + re.getMessage() );
state = false;
throw new RuntimeException( re );
}
catch( Exception e )
{
debug.print( 1, "Fehler bei ARP Abfrage: " + e.getMessage() );
return erg;
}
finally
{
if( state == true )
{
if (handle != null && handle.isOpen())
{
handle.close();
}
if (sendHandle != null && sendHandle.isOpen())
{
sendHandle.close();
}
if (pool != null && !pool.isShutdown())
{
pool.shutdown();
}
}

debug.print( 2, destinationIP + " was resolved to " + resolvedAddr );
}
return resolvedAddr.toString();
}

private void throwRuntimeException()
{
throw new RuntimeException( "RunTime Fehler bei " + destinationIP );
}

private static class Task implements Runnable
{

private PcapHandle handle;
private PacketListener listener;

public Task(PcapHandle handle, PacketListener listener)
{
this.handle = handle;
this.listener = listener;
}

@Override
public void run()
{
try
{
handle.loop(COUNT, listener);
}
catch (PcapNativeException e)
{
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
catch (NotOpenException e)
{
e.printStackTrace();
}
}

}

}[/CODE]
 

Oneixee5

Top Contributor
Einen Thread kann man beenden indem man thread.interrupt(); aufruft. Der Thread muss dann auf das interrupt-Signal reagieren.
Java:
while (!thread.isInterrupted()) {
    System.out.println("running");
}
System.out.println("stopped.");
Man kann das Verhalten auch mit einer boolean-Variable erreichen.
Reagiert der Thread nicht auf das interrupt-Signal wird er weiterlaufen bis er irgendwann von selbst endet oder die VM gekillt wird.

ExecutorService.schutdownNow() stoppt nicht die einzelnen Threads, es gibt keine Versuche die Verarbeitung aktiv ausgeführter Aufgaben anzuhalten.
 
K

kneitzel

Gast
Die Frage ist doch erst einmal: Welcher Thread ist das denn genau? Und wo wird welche Exception geworfen? Wenn die in diesem Thread geworfen wurde und der Thread diese Exception nicht behandelt hat, dann ist der Thread auch beendet. Daher scheint es das ja nicht zu sein.

Ist es evtl. der Task mit dem handle.loop?

Wenn der PcapHandle noch aktiv ist, dann wäre dieser Task per breakLoop() und close() bestimmt zu beenden.

Generell ist immer die Frage: Was läuft denn in dem Thread, den Du stoppen können willst? Und wie kannst Du das unterbrechen? Und wenn es da noch keine Möglichkeit gibt, dann muss man da was bauen.
 

freehawk

Mitglied
Hallo zusammen,

genau das ist der Task mit dem handle.loop.

Ich habe jetzt die Funktionen breakLoop benutzt bei dem PcapHandle und jetzt ist der Fall der hängen bleibenden Threads erstmal nicht mehr aufgetaucht. Manchmal sieht man einfach den Wald vor lauter Bäumen nicht. Danke für den Tipp.

Gruß
Markus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Thread und Ratelimiter Netzwerkprogrammierung 4
OnDemand Linux RAM per Thread Netzwerkprogrammierung 3
V Socket Audio Clip loopen ohne neuen Thread Netzwerkprogrammierung 2
C Thread Netzwerkprogrammierung 9
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
A RMI RMI - Thread Objekte übertragen und auf anderer Machine weiterlaufen lassen Netzwerkprogrammierung 0
S Socket ThreadPool oder Thread pro Client? Netzwerkprogrammierung 11
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
P Wie spreche ich einen Thread an? Netzwerkprogrammierung 20
M Thread Scheduler Java 5.0? Netzwerkprogrammierung 2
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
D Socket Dynamische Socket-Thread Erzeugung Netzwerkprogrammierung 2
B Socket Thread handling / Reader init Netzwerkprogrammierung 8
Z Socket Socket-Thread falsch? Netzwerkprogrammierung 5
Helgon Socket Thread Pooling Netzwerkprogrammierung 6
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
B callback thread udp Netzwerkprogrammierung 2
D RMI und Thread Netzwerkprogrammierung 4
S Kommunikationsproblem, Thread und manuel Netzwerkprogrammierung 4
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
K ein Thread pro Stream Netzwerkprogrammierung 2
D Weiterer Thread auf Port 843 horcht Netzwerkprogrammierung 7
D Thread problem Netzwerkprogrammierung 3
S Thread, Daten vom Socket lesen Netzwerkprogrammierung 2
S Thread Transport Netzwerkprogrammierung 6
S Socket Thread in Schleife Netzwerkprogrammierung 4
G Objekte per TCP verschicken + Thread Netzwerkprogrammierung 4
T synchronized mit thread und rückgabe Netzwerkprogrammierung 4
Q Thread und Sockets... Netzwerkprogrammierung 2
2 Class mit ServerSocket erbt von Thread? Netzwerkprogrammierung 3
PAX Outputstream von anderem Thread verwenden lassen Netzwerkprogrammierung 5
C Server mit Multithreading (Thread-Pool) Netzwerkprogrammierung 2
E java.lang.NullPointerException aber nur wenns im Thread läuf Netzwerkprogrammierung 4
F EIN Thread in RMI auf Serverseite Netzwerkprogrammierung 3
G Server Thread beenden Netzwerkprogrammierung 16
T Socket-Thread: Designfrage Netzwerkprogrammierung 14
S Mit Thread arbeitende Maschine Netzwerkprogrammierung 6
T select() ohne NIO - oder wie Worker-Thread sauber beenden? Netzwerkprogrammierung 9
K Selbe Streams mehrfach nutzen (zusätl. Thread) Netzwerkprogrammierung 6
ven000m Thread Frage Netzwerkprogrammierung 11
B Thread.start() (run()) excption Netzwerkprogrammierung 2
M Thread läuft nicht weiter Netzwerkprogrammierung 2
B NullPointerException | Thread Netzwerkprogrammierung 4
U Current thread not owner Netzwerkprogrammierung 3
S readline-thread stoppt vorzeitig Netzwerkprogrammierung 6
J RMI - (RemoteException occurred in server thread) Netzwerkprogrammierung 2
S Webserverprogrammierung: Thread-Beschränkung Netzwerkprogrammierung 2
M Exception in thread "main" java.lang.NoClassDefFou Netzwerkprogrammierung 2
F problem mit thread bzw. netzwerkverbindung! Netzwerkprogrammierung 3
L netzwerk mit thread Netzwerkprogrammierung 3
G RMI thread safe ? Netzwerkprogrammierung 11
A Thread gibt Nachrichten mehrmals aus (Messenger in Java) Netzwerkprogrammierung 3
J ServerSocket sauber beenden Netzwerkprogrammierung 3
J Website-Zugriff beenden Netzwerkprogrammierung 11
T Server mit ThreadPool beenden Netzwerkprogrammierung 5
B Socket BufferedReader.readLine() beenden ohne den Stream zu closen Netzwerkprogrammierung 7
F Netzwerkprogramm sauber beenden Netzwerkprogrammierung 3
T RMI Registry nicht mit beenden. Netzwerkprogrammierung 6
V Multithreaded Server ueber Konsole beenden Netzwerkprogrammierung 6
musiKk Server sauber beenden Netzwerkprogrammierung 6
TRunKX Threads beenden sich selber? Netzwerkprogrammierung 6
B Mit RMI Server beenden Netzwerkprogrammierung 4
Y server mit endlosse schleife beenden Netzwerkprogrammierung 6
G Prozess beenden auf Unix Netzwerkprogrammierung 11
N Sock will nicht richtig beenden Netzwerkprogrammierung 7

Ähnliche Java Themen


Oben