# Ethernet Daten abfangen



## MustiTR (27. Aug 2008)

Hallo

wie kann ich in eine laufende Verbindung (Port) mich zwischenschalten,abhören?
Mein Problem ist das ich ein Gerät habe welches mit ein bestimmten Programm über LAN Kabel kommuniziert und Daten an den Rechner schickt. Die Software muss dabei mit dem Gerät in Verbindung bleiben weil es auch Information zum Gerät schickt welches es am laufen hält. Der Datenstrom das vom Gerät kommt hört,solang man vom Software aus nicht abbricht, nicht auf.

Ich dachte mit ein einfachen Socket welches auf dem Port zugreift wohin die Daten fließen könnte man sich zwischenschalten nur Passiert bei mir nichts. Kann es sein das einige Ports keine 2. Anwendung zulassen die mitschneiden möchten? Wenn ja wie umgehe ich es und kann mitschneiden was an Daten rüberkommen.

Ablauf ist folgenderweise:

1- Starte die Software vom Gerät
2- Gerät fängt an Daten an diese Software zu schicken
3- Ich starte mein Java Programm und versuche vom Port wohin die Daten gehen mitzuschneiden.

Mit Wireshark konnte ich überprüfen auch wirklich die Daten an den richtigen Port geschickt werden, der zeigt mir sogar an welche Daten gerade vom Port fließen genau die müsste ich mit mein Java Programm auch abfangen.
Nur mein Java Code tut so als ob er nie Daten bekommt.

Folgenden Code hab ich dazu geschrieben:


```
public class Receive {

	ServerSocket socket;
	ODTFilter fil;
	
	Receive(int portNr,String url,int value) throws IOException{
		
		socket = new ServerSocket(portNr);
		fil  = new ODTFilter(url,value);
	} 
	
	public void makeMappa() throws IOException {
		
		boolean start = true;
		byte[] b = new byte[4];
					
		Socket client = serverSocket.accept();
		InputStream input = client.getInputStream(); // Hier bleibt mein Programm stehen		
		while(start) {
			input.read(b); 
			fil.fillMappa(b);
		}
		input.close(); 
	}
```


----------



## musiKk (27. Aug 2008)

Ob reines Mitschneiden mit Java moeglich ist, entzieht sich meiner Kenntnis. Du koenntest allerdings eine Art Proxy spielen. D.h. du startest den Server, dann dein Java-Programm und dann verbindest du dich mit dem Client zu deinem Programm und schickst alle Daten, die dir der Client schickt direkt an den Server weiter (und dessen Antworten auch wieder an den Client zurueck). Dadurch muessen alle Daten an deinem Programm vorbei.

Das Ethernet befindet sich uebrigens 2 bis 3 OSI-Schichten unter der Port-Thematik.


----------



## MustiTR (28. Aug 2008)

und wie sieht das genau aus ? kanns du mir ein beispiel zeigen?


----------



## Kim Stebel (28. Aug 2008)

warum benutzt du nicht einen normalen sniffer? wireshark, kismet, tcpdump...


----------



## tuxedo (28. Aug 2008)

@Kim
*zustimm*

Wenn du nur analysieren und mitscheiden willst ist WireShark (google) wohl die beste und schnellste Lösung.

Mit Java bricht man sich da nur unnötig einen ab.


----------



## musiKk (28. Aug 2008)

Wireshark hat der OP ja schon verwendet. Wenn die Daten in einem Java-Programm verwendet werden muessen, dann koennte man auch per Wireshark aufzeichnen und die PCAP-Datei (da gabs auch mal nen Thread hier) verwursten.


----------



## MustiTR (28. Aug 2008)

Mein Problem ist das ich mit den Daten weiter arbeiten muss es sind einfache hexa werte die rüberkommen, die java klasse soll eine schnittstelle für das gerät werden und sie auch anschließen weiterverarbeiten es reicht mir also nicht einfach nur die daten einsehen zu können.


----------



## MustiTR (1. Sep 2008)

Weiss denn keiner bescheid ?


----------



## Kim Stebel (1. Sep 2008)

es wurden doch schon zwei lösungsansätze(sniffer, proxy) genannt, was willst du noch? sniffer scheint in deinem fall nicht geeignet, also schreib nen proxy.


----------



## MustiTR (1. Sep 2008)

ich habe keine ahnung wie so ein proxy geschrieben wird  könnte mir einer ein beispiel zeigen/ geben. oder wie sowas funktioniert ??


----------



## tuxedo (2. Sep 2008)

http://de.wikipedia.org/wiki/Proxy_(Rechnernetz)

Für den Anfang sollte das hilfreich sein. Dann schaust du in der Javainsel nach wie man mit der Netzwerkprogrammierung umgeht. Wenn du dann konkrete Fragen hast: Her damit.

Ein Proxy ist eben nichts triviales was man in 2 Zeilen Code gebastelt hat. Da gehört je nach Anforderung schon ein bisschen mehr dazu.

- Alex


----------



## Franz22 (2. Sep 2008)

dein Programm funktioniert nicht effizient, da du ein blockierendes Programmiermodel verwendest. Um effizientes Proxy in Java zu schreiben kommst du an Java NIO nicht vorbei. Unter http://xsocket.svn.sourceforge.net/...c/test/java/org/xsocket/connection/Proxy.java findest du ein Proxy-Beispiel auf Basis der NIO-Library xSocket


----------



## tuxedo (2. Sep 2008)

>> Um effizientes Proxy in Java zu schreiben kommst du an Java NIO nicht vorbei

Ganz so pauschalisieren würde ich das nicht. Viele Anwendungen nutzen das standard IO und sind dennoch effizient. 
Wenn der Proxy allerdings tausende Clients bedienen können soll und ein Gigabitnetz exzellent ausnutzen können soll, dann wäre NIO in der Tat nicht schlecht. Aber wenn es nur um eine Hand voll Clients geht die in einem 100Mbit Netzwerk leben, lohnt sich der Aufwand für NIO nicht wirklich. Okay, xsocket nimmt einem viel Arbeit ab, aber vielleicht will man keine Abhängigkeiten zu anderen Libs haben? Dann müsste mans selbst machen, und dann steht man wieder vor dem zusätzlichen Aufwand.

Wie dem auch sei: Man muss es eben abwägen. Aber pauschalisieren würde ich das nicht.

- Alex


----------



## MustiTR (14. Sep 2008)

Hi Leute ich bin es wieder einmal...
Ich habe mich entschlossen die Sache mit Jpcap zu machen. 
Kennt sich einer mit Jpcap einigermaßen aus ?


```
ReceiveJpcap recJpcap = new ReceiveJpcap("C:\\Users\\Username\\Desktop");
		NetworkInterface[] devices = JpcapCaptor.getDeviceList(); 
		
		
		try {
			JpcapCaptor jpcap = JpcapCaptor.openDevice(devices[1], 8, false, 0);
			
			jpcap.loopPacket(-1, recJpcap);
			
		} catch (IOException e) {
			System.out.println("Fehler Main Klasse: " +e.getMessage());
		}
```

hab ich geschrieben.

Diesmal hab ich das Problem das ich irgendwie nicht alle Pakete zum Greifen bekomme. Die Datei dich ich mit reJpcap fülle wächst nicht annährend so schnell wie die Daten die geschickt werden.
Wieso greift jpcap.loopPacket nicht alles auf und speichert es ab ??? Oder kann es daran liegen das mein Algorithmus in ReceiveJpcap nicht schnell genug ist ?
Wenn mir einer weiterhelfen kann würde ich mich freuen.


----------

