TrafficClass eines UDP Pakets kommt beim Empfänger nicht an

Status
Nicht offen für weitere Antworten.

kulri

Mitglied
Hallo!

Ich sende UDP Pakete von A nach B, beide im selben LAN, ohne einen Router dazwischen. Dabei möchte ich das Type-of-Service-Feld (TrafficClass) des IP Headers setzen.
Am sendenden DatagramSocket setze ich die TrafficClass des Pakets und gebe sie gleich danach wieder aus:
Code:
  sendingSocket.setTrafficClass(0x08|0x10);
  System.out.print.n(sendingSocket.getTrafficClass());
Es wird 24 ausgegeben, was 0x18 entspricht, ok soweit.

Aber auf der Empfängerseite warte ich zuerst auf ein paar Pakete, und versuche dann, deren TrafficClass auszulesen:
Code:
  receivingSocket.getTrafficClass();      // returns 0
Hier wird jedoch die 0 zurückgegeben. Es ergeben sich für mich zwei Fragen:
1) Warum steht im ToS-Feld auf der Empfängerseite nicht mehr der beim Sender gesetzte Wert? Wird der irgendwo überschrieben?
2) Ich verstehe nicht, warum man beim Empfänger die TrafficClass über den receivingSocket ausliest, und nicht über das Datagram Packet. Ich meine, können an diesem receivingSocket nicht UDP Pakete verschiedener Anwendungen ankommen, die alle das ToS-Feld unterschiedlich befüllt haben?

Danke sehr!

Gruß
kulri
 

HoaX

Top Contributor
kulri hat gesagt.:
Es ergeben sich für mich zwei Fragen:
1) Warum steht im ToS-Feld auf der Empfängerseite nicht mehr der beim Sender gesetzte Wert? Wird der irgendwo überschrieben?
Das ist der Wert zum Senden über diesen Socket und hat mit den empfangenen Paketen nichts zu tun.

kulri hat gesagt.:
2) Ich verstehe nicht, warum man beim Empfänger die TrafficClass über den receivingSocket ausliest, und nicht über das Datagram Packet. Ich meine, können an diesem receivingSocket nicht UDP Pakete verschiedener Anwendungen ankommen, die alle das ToS-Feld unterschiedlich befüllt haben?
Das siehst du richtig. Wo hast du das denn so falsch abgeschaut? Wenn du den ToS irgnedwo auslesen kannst, dann nur aus dem Paket.
 

kulri

Mitglied
verstehe, danke für die schnelle Antwort.
hört sich auch plausibel an. Wenn ich dich richtig verstanden haben, sagst du, die Methode setTrafficClass setzt sozusagen nur eine Option/Einstellung der Klasse DatagramSocket, nicht aber das ToS-Feld des IP Headers.
Aber ich lass auf Empfänger- sowie auf Senderseite wireshark die pakete sniffen. Und da sehe ich, dass auf der Senderseite das ToS-Feld den Wert enthält, den ich reingeschrieben habe, auf der Empfängerseite aber nicht mehr, da steht dann immer 0 drin.
Das spricht doch eigentlich gegen deine Erklärung, oder?
 

HoaX

Top Contributor
Moooooment, ich glaube du drückst dich ungenau aus. Liest du nun auf Empfängerseite mit Wireshark oder mit deinem Javaprogramm das ToS-Feld aus und welche Werte spucken beide aus?

Wenn du auf Senderseite das ToS am Socket setzt, dann setzt der Socket beim Senden von Paketen das ToS-Feld entsprechend.

Auf Empfängerseite kommst du scheinbar garnichtmehr ran, da scheinbar DatagramPaket keine Methode dafür bereitstellt.

getTrafficClass() vom Empfängersocket gibt dir den Wert zurück, den dieser Socket beim Senden setzt und nicht auf das, was zuletzt empfangen wurde.
 

kulri

Mitglied
ja, viell habe ich mich nicht ganz klar ausgedrückt. Nochmal kurz zum Hintergrund:

Ich habe einen UDPClient.java, dieser sendet UDP DatagramPackets:
Code:
DatagramSocket socket = new DatagramSocket();
socket.setTrafficClass(SET_TYPE_OF_SERVICE);       //hier versuche ich, das ToS-Feld des IP Headers zu setzen

DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByAddress(TARGET_ADDRESS), PORT);
socket.send(packet);
Und ich habe einen UDPServer.java, dieser empfängt UDP DatagramPackets.
Code:
DatagramSocket receivingSocket = new DatagramSocket(PORT);
DatagramPacket packet = new DatagramPacket(new byte[PACKET_SIZE], PACKET_SIZE);
while(true)
{
  receivingSocket.receive(packet);
  receivingSocket.getTrafficClass();
}
Ok, dass receivingSocket.getTrafficClass() nicht die TrafficClass des Pakets, sondern die des Sockets zurückgibt, sehe ich ein. wie solle es auch anders gehen?
Naheliegend wäre doch, die TrafficClass aus dem Paket auszulesen, aber im DatagramPacket gibt es ja eine solche Methode nicht. Das Auslesen des ToS-Feldes an sich ist mir auf Server-Seite auch garnicht wichtig, ich mach das nur zum testen. Und da das ja nicht funktioniert, sniffe ich die Pakete mit wireshark.

Wireshark läuft auf Sender- und auf Empfängerseite und zeigt mir folgendes:
Senderseite: ToS-Feld korrekt gesetzt.
Empfängerseite: ToS-Feld ist 0.

Ich habe auch einen Freund beauftragt, meinen Code mal bei sich auszuprobieren, weil: anderer PC, anderes LAN, andere Person. Er hat sich mittlerweile wieder gemeldet und berichtet:
"Egal was ich mache, das ToS-Feld ist IMMER, auf Sender- und Empfängerseite korrekt, genauso, wie ich es gesetzt habe. Ich kann dein Problem nicht nachvollziehen..."

Dafür könnte es 3 Schuldige geben:
mein PC
mein LAN
meine Dummheit

.... ich hoffe, nicht Letzteres ;)

Falls dir noch was einfällt, wäre ich dankbar. Aber offensichtlich ist es kein Java-Problem.

Ach ja: Ich sende zwischen zwei PCs, nicht localhost. Die PCs hängen über einen switch zusammen, kein Router.
An einem PC läuft WinXP 32, an dem anderen WinXP 64, IP Adressen habe ich auf beiden seiten private vergeben (10.x.x.x). hmm... sonst noch irgendwas wichtiges... ? ich glaube nicht.
 

HoaX

Top Contributor
Dann liegts wohl an deinem Rechner/Firewall/... kann man nicht genau sagen - jedenfalls nicht am Java-Code. Das eigentliche Problem ist ja nun "gelöst".
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M SocketError bei Aufruf eines SOAP-Servers Netzwerkprogrammierung 8
G seite nach posten eines html-forms laden Netzwerkprogrammierung 0
J Protokolle innerhalb eines Heimnetzwerks Netzwerkprogrammierung 6
V Kann man mit Hilfe eines Java-Programms den Zugriff auf bestimmte Internetseiten verhinden? Netzwerkprogrammierung 3
N Name eines Attributes aus einem festen String und einer Variablen generieren Netzwerkprogrammierung 5
X Response eines RESTful-Service mit JSON Netzwerkprogrammierung 8
F Neuer Json aus teilen eines vorhandenen Json Netzwerkprogrammierung 0
N Client Identifikation eines Servers Netzwerkprogrammierung 1
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
K Multiplayer eines Spiels Netzwerkprogrammierung 21
K Ansprechen eines Remote Druckers Netzwerkprogrammierung 2
L Erstellen eines Online Multiplayer Apps Netzwerkprogrammierung 10
eLogic Download eines Links Netzwerkprogrammierung 2
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
2 Schliessen eines Serversockets Netzwerkprogrammierung 2
Hindi93 Abbruch eines Programmes abfangen Netzwerkprogrammierung 8
1 SSH-Kommunikation - Ende eines Streams nicht erkenntlich Netzwerkprogrammierung 2
C Alle Computer eines Netzwerkes finden Netzwerkprogrammierung 32
N Senden eines Arrays Netzwerkprogrammierung 6
U Name eines Netzlaufwerks ermitteln Netzwerkprogrammierung 5
L Body eines http Request auslesen Netzwerkprogrammierung 2
K Ende eines HTTP Response/Request Netzwerkprogrammierung 6
aze Tcp Verkehr eines Applets simulieren Netzwerkprogrammierung 10
J Socket Erreichbarkeit eines Java Servers (Socket-Lösung) über das Internet Netzwerkprogrammierung 3
M Socket Leistungsfähigkeit eines xSocketservers, wieviele Verbindungen max? Netzwerkprogrammierung 4
clupus Exception beim Schließen eines Sockets Netzwerkprogrammierung 6
cowabunga1984 Transferierte Datenmenge eines SOAP Clients (JAX-WS) anzeigen Netzwerkprogrammierung 2
musiKk Problem bei bidirektionaler Nutzung eines Socket Netzwerkprogrammierung 2
J Machbarkeit eines Bluetooth-Servers? Netzwerkprogrammierung 2
S Realisierung eines Netzwerkcodes für ein Strategiespiel Netzwerkprogrammierung 7
K "Ende eines Sockets" Netzwerkprogrammierung 9
A Broadcast - senden eines Packetes an alle rechner im netz Netzwerkprogrammierung 15
P problem beim schließen eines Streams Netzwerkprogrammierung 6
K Mit Java-MailAPI dir Verfügbarkeit eines SMTP-Servers prüfen Netzwerkprogrammierung 4
J while-Schleife / Abbruchbed. beim Einlesen eines Streams Netzwerkprogrammierung 4
U Ende eines Inputstreams ermitteln Netzwerkprogrammierung 3
J Länge eines Streams Netzwerkprogrammierung 4
T Timeout eines KSOAP-Calls Netzwerkprogrammierung 5
G Info eines Webseites kopieren Netzwerkprogrammierung 16
J Antwort eines Soaprequests parsen mittels org.apache.soap Netzwerkprogrammierung 2
E Möglichkeit zum Timeout eines Process Netzwerkprogrammierung 7
T Erstellung eines Proxy Netzwerkprogrammierung 11
T Pfad eines Servlets rausfinden Netzwerkprogrammierung 2
O Einbinden eines java-servers Netzwerkprogrammierung 9
C Übergabe eines Datensatzes (Übergabestruktur) Netzwerkprogrammierung 12
G Verzeichnis eines Rechners übers Netzwerk auslesen Netzwerkprogrammierung 5
B Problem mit der Ausgabe eines Strings an SocketOut Netzwerkprogrammierung 4

Ähnliche Java Themen


Oben