ICMP Destination Unreachable: UDP Paket wird nochmals gesendet?
-
Hey!
Mein Programm ist in etwa so aufgebaut:
while(true) { SOCKADDR_IN from = UDPRecvFrom(udpSocket, recvData); std::ostringstream oss; if(recvData.find("whatever") != std::string::npos) { // ... UDPSendTo(udpSocket, oss.str(), from.sin_port, from.sin_addr.s_addr); // ... } } // ... // Hier noch die eigenen recv/send Funktionen: void UDPSendTo(SOCKET socket, const std::string& data, unsigned int port, const std::string& ip) { UDPSendTo(socket, data, htons(port), inet_addr(ip.c_str())); } void UDPSendTo(SOCKET socket, const std::string& data, unsigned int port, unsigned long ip) { SOCKADDR_IN sendAddress = { }; sendAddress.sin_family = AF_INET; sendAddress.sin_port = port; sendAddress.sin_addr.s_addr = ip; sendto(socket, data.c_str(), data.size(), 0, reinterpret_cast<SOCKADDR*>(&sendAddress), sizeof(SOCKADDR_IN)); } SOCKADDR_IN& UDPRecvFrom(SOCKET socket, std::string& data) { static SOCKADDR_IN from = { }; char buffer[4096]; int fromSize = sizeof(SOCKADDR_IN); recvfrom(socket, buffer, sizeof(buffer), 0, reinterpret_cast<SOCKADDR*>(&from), &fromSize); data = buffer; return from; }Also pro empfangenem Paket wird eines zurück an die Quelle gesendet.
Nun habe ich aber folgendes beobachtet:Irgendwie ist es passiert, dass ständig Pakete an ein paar IP's versendet werden, und von diesen IP's kam dann ein "ICMP Destination Unreachable" zurück, woraufhin gleich wieder UDP Pakete versandt wurden.
Aber: Mein Programm kann doch eigentlich nicht so viel senden, weil keine UDP Pakete empfangen werden, sondern nur ICMP.
Meine Vermutung:
Mein Programm empfängt ein UDP Paket, antwortet mit einem UDP Paket, dieses kann aber am Ziel nicht mehr zugestellt werden und das Ziel sendet ein ICMP Destination Unreachable.
Daraufhin versucht es irgendein Netzwerklayer auf meiner Seite nochmals mit der Zustellung des UDP Pakets, bekommt aber wieder ICMP D..U.. und so geht es in eine Endlosschleife.Kann das sein? Gibt es eine Schicht, die so etwas tun würde? Automatisch bei ICMP Destination Unreachable nochmals das Paket zu versenden?
Denn wiegesagt, meine Applikation kann doch gar nicht so viel senden, ohne auch etwas zu empfangen. Also wiegesagt, zu der Zeit, zu der ich beobachtet habe, hat der Computer nur lauter UDP Pakete rausgeschickt und ICMP empfangen, aber kein UPD empfangen.
Danke!
-
Heinz2 schrieb:
Kann das sein? Gibt es eine Schicht, die so etwas tun würde? Automatisch bei ICMP Destination Unreachable nochmals das Paket zu versenden?
normalerweise nicht. du solltest dann einen fehler von 'sendto' bekommen, aber paketwiederholungen sollte UDP eigentlich nicht von selbst machen.

-
Mist, wie kann dieses Programm dann ständig senden, obwohl es nichts empfängt...
-
Wenn es im Netzwerklayer liegt solltest du das Problem durch das Senden eines einzigen Pakets an eine solche Adresse hervorrufen können. Falls nicht, dann liegt es an deinem Code.
Übrigens gehe ich eher von letzterem aus. Diese Vermutung wird auch besonders davon gestärkt, dass du die Rückgabewerte der System-API nicht auswertest.
-
Aber es wurde kein UDP empfangen, aber ständig UPD gesendet. Dabei sollte mein Code doch in jedem Fall pro empfangenem UPD Paket genau ein UDP Paket zurücksenden.
-
Heinz2 schrieb:
Aber es wurde kein UDP empfangen, aber ständig UPD gesendet. Dabei sollte mein Code doch in jedem Fall pro empfangenem UPD Paket genau ein UDP Paket zurücksenden.
Die Rückgabewerte und Wireshark sind deine Freunde. Unsere Kristallkugeln dagegen nicht...
-
Heinz2 schrieb:
Aber es wurde kein UDP empfangen, aber ständig UPD gesendet. Dabei sollte mein Code doch in jedem Fall pro empfangenem UPD Paket genau ein UDP Paket zurücksenden.
mach' einfach 'ne ausgabe nach dem 'sendto', dann siehste wie oft gesendet wird. mich würde es wundern, wenn windows UDP-pakete mehrfach raushauen würde, gerade nach 'nem ICMP-unreachable wär's nicht besonders sinnvoll. ich schätze eher du hast irgendwo 'nen bug, dar dafür sorgt, dass die sendefunktion öfter aufgerufen wird, als du glaubst.

-
Habe eh mit nem Paketlogger geguckt. Ständig werden UDP Pakete an ein paar verschiedene IP's gesendet, und von denen kommt halt ICMP Dest. Unreachable zurück. Doch es wird munter weitergesendet.
Welchen Bug soll das bisschen Code denn haben? Der Grundaufbau ändert sich nicht. recvfrom() mit anschließend einem sendto() in einer Schleife, aus. Da kann doch gar nicht mehrfach gesendet werden, und schon gar nicht, wenn kein UDP empfangen wird...Das Ding ist ja:
Mein Router hat ne default Firewall-Regel, welche nichts von außen reinlässt. Somit wurde auch nie ICMP empfangen, höchstens zum Router-Interface (192.168.0.1) als Ping-Type.
Dann hatte ich einen neuen Router besorgt. Dieser hatte diese Firewall-Regel nicht, und es kamen ICMP Pakete nach 192.168.0.3 durch.
Und ab da trat das Problem auf.
Der Code hat immer normal funktioniert. Doch seitdem ICMP empfangen wird, spielt es verrückt.Deshalb hab ich höchsten Verdacht, dass es mit den empfangenen ICMP-Paketen zusammenhängt.