UDP Probleme
-
hi,
ich versuche eine UDP socket klasse zu schreiben.
daten empfangenu und senden funktioniert.
aber unter bestimmten (mir noch unbekannten) bedingungen tritt der fehler auf, dass der absender eines udp packetes nicht richtig erkannt wird.
im angehängten beispiel funktioniert es wenn zeile 26 in der main.cpp auskommentiert ist, ansonsten nicht.
das ganze wurde unter linux geschrieben und dürfte unter windows nicht kompilieren. wäre nett wenn es sich jemand mal anschauen würde.thomas
hier die aktuelle version:
http://xirror.com/spread/77756076/UDPSocket.tar.bz2.htmlunten altes zeug:
hier das ganze als tar.bz2 zum download
http://xirror.com/spread/91631401/UDPSocket.tar.bz2.htmlund hier der code gepastet:
build.sh
main.cpp
UDPSocket.cpp
UDPSocket.h
UDPSocketException.h
UDPSocketException.cpp
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Funktioniert nicht? Was funktioniert denn nicht?
Ansonsten tippe ich darauf, dass Du irgendwo über deine Buffer schreibst, und das klappt dann nicht mehr wenn da noch ein int auf dem Stack liegt.
-
Wieso wurde der Beitrag nach Unix verschoben? Wir wissen doch gar nicht, ob das Problem plattformspezifisch ist. Ich habe mal das Projekt auf Win/VS2008 portiert. Was ist nun genau das Problem?
-Das Exception handling in recvFrom ist unkorrekt.
-in den verlinkten Dateien ist UDPSocketException.h fälschlicherweise als UDPSocketException.cpp angegeben
-Wie sieht die Server-Seite aus? Hast Du da ebenfalls eine Klasse implementiert?
-Warum benutzt Du sockaddr * in UDPSocket::recvFrom als Parameter? Wäre es nicht besser, das zu verstecken und den Buffer auszugeben?
-es fehlt delete[] buffer;
-
also das eigentliche problem ist dass ich manchmal als absender eine falsche ip kriege.
witte_, funktioniert die klasse bei dir denn?
-Das Exception handling in recvFrom ist unkorrekt.
ups, keine ahnung was ich mir dabei gedacht habe.. hatte das in ner älteren version richtig und habs dann irgendwie kaputtgemacht, keine ahnung ich hab mich stundenlang damit rumgeschlagen und war dann wohl nichtmehr so konzentriert.
aber daran wirds wohl nicht liegen.-in den verlinkten Dateien ist UDPSocketException.h fälschlicherweise als UDPSocketException.cpp angegeben
ändere ich
-Wie sieht die Server-Seite aus? Hast Du da ebenfalls eine Klasse implementiert?
serverseitig hab ich sowohl netcat als auch meine eigene klasse verwendet, macht keinen unterschied.
-Warum benutzt Du sockaddr * in UDPSocket::recvFrom als Parameter? Wäre es nicht besser, das zu verstecken und den Buffer auszugeben?
der absender interessiert mich auch, nicht nur der inhalt des packets.
ob es sinnvoller wäre den absender als string oder sonstwas auszugeben ist ja erstmal egal-es fehlt delete[] buffer;
auf sowas hab ich weniger geachtet, das war eher erstmal eine sinnloses programm um die klasse zu testen, aber danke. delete a; fehlt auch;)
-
so, hier ist jetzt meine aktuelle version:
http://xirror.com/spread/77756076/UDPSocket.tar.bz2.htmltest1 gibt mir diese ausgabe:
./test1 recieved 6 bytes:blo11 from 127.0.0.1 recieved 6 bytes:blo11 from 127.0.0.1
test2 gibt diese ausgabe:
./test2 terminate called after throwing an instance of 'UDPSocketException' what(): UDPSocket::recvFrom : recvfrom failed. Abgebrochen
wenn ich zeile 26 in main2.cpp auskommentiere kriege ich diese ausgabe:
./test2 hallo von 127.0.0.1 HALLO von 127.0.0.1
zeile 26 ist folgende:
int asd = 333;
was für mich keinen sinn ergibt.
kompiliert das bitte mal und sagt mir was bei euch passiert, langsam traue ich meinem computer nichtmehr...
-
Wenn ich recvfrom verwende, bekomme ich
WSAGetLastError-Code 10014 WSAEFAULT: Bad address.
The system detected an invalid pointer address in attempting to use a pointer argument of a call. This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument, which is a sockaddr structure, is smaller than the sizeof(sockaddr).Wenn ich recv verwende (localhost),lese ich das aus was sendto in den Deskriptor geschrieben hat.
-
Kannst Du mal versuchen, meine ungültige Adressenmeldung und Dein Verhalten zusammen-zu-interpretieren? Es ist anzunehmen, das Speicherbereiche unerlaubt überschrieben werden und dieses nichtdeterministische Verhalten erzeugt.