/Wiederholungsszenario funktioniert wie erwartet :
Ich habe eine Ping/Pong und Kasten A und B sind durch ein einzelnes Ethernet -Kabel miteinander verbunden:
App A :
while (1) {
// Send PING + pass sockaddr_ll with interface info
sendto(...);
// Block until PONG is received + logic to ignore irrelevant traffic
recv(...);
}
while (1) {
// Block until we recv a PING + logic to ignore irrelevant traffic
recv(...);
// Reply with a PONG + pass sockaddr_ll with interface info
sendto(...);
}
< /code>
Wie erwähnt, funktioniert dies alles einwandfrei. Das [url=viewtopic.php?t=11587]Problem[/url] tritt auf, wenn ich App [b] a [/b] zu:
änderewhile (1) {
sendto(...); // PING 1
sendto(...); // PING 2
recv(...); // PONG 1
recv(...); // PONG 2?
}
< /code>
Einige wichtige Beobachtungen: < /p>
[*] Der zweite Aufruf zu recv < /code> kann einfach unbegrenzt blockieren. Je mehr Sie es schleifen lassen, desto wahrscheinlicher wird es passieren, tritt jedoch normalerweise innerhalb der ersten 10-20 Iterationen auf. < /P>
< /li>
Ich dachte es Könnte nur einen schlechten Code sein, aber wenn ich die Schnittstelle in Box A mit TCPDump überwachte, wird auch TCPDump nicht berichtet, dass der Frame auf der Schnittstelle angezeigt wird. Nachdem Sie einige Sekunden gewartet und Strg+C in App A gedrückt haben, meldet das Ausführen von ifConfig
einen neuen fallengelassenen Frame auf der Schnittstelle.
< LI> Ich weiß, dass Kasten B mit der Pong antwortet, weil ich die Hardware zur Netzwerküberwachung verwendet habe, um die Antworten von b -> A auf ein separates Feld C und TCPDump auf C -Berichten zu spiegeln Pong. Ich denke nicht (?) Es ist nur ein Problem mit Kasten a. der zweite recv und ich verwende Ein separates Programm zum Senden eines beliebigen nicht-pongischen Frame an derselben Schnittstelle und über die Kabel, auf die App A+B kommunizieren, und dann wird es den letzten Pong durchsetzen und App A wird auf recv aufhören zu blockieren . Ich kann dies entweder aus Kasten A oder Kasten B tun, solange es an die Schnittstelle des Subjekts gesendet wird, und es wird es immer noch "treten". Es braucht nur einen Datenverkehr, um es durchzusetzen. Schnittstelle, aber schließlich bleibt wieder stecken. > Nur App A , senden Sie diese Das erste "Ping" wird die Schnittstelle "treten" und die erste Pong, die es erhält, wird das sein, das bisher nirgends aus dem letzten Lauf zu finden war. < /p>
< /li>
< LI> Sendungsgeschwindigkeit kann etwas damit zu tun haben. Wenn ich die Schleife entferne und App eine von Hand wiederholt neu ausführte, wird es nicht geschehen (oder ich habe sie noch nicht gesehen). Deshalb habe ich sie auf einer Schleife. Aber logischerweise sollten auf dem Draht jeweils nur 2 Frames anhängig sein? Was ich hier erlebe? Scheint, als würden sich der Kernel oder sogar die NIC nur am Rahmen festhalten und nicht loslassen, bis etwas anderes dahinter ihn durchträgt? Ich glaube nicht, dass es Nagles Algorithmus sein kann, weil ich mich mit RAW -Ethernet -Rahmen und nicht mit TCP zu beschäftigen kann. Die Tatsache, dass selbst TCPDump nicht berichtet, dass der verlorene Rahmen umwerfend ist. Schlechte NICs auf beiden Boxen (siehe Punkt 4)? Wie kann ich das weiter debuggen? Sie müssen den Promiscuous -Modus selbst aktivieren, indem Sie IP -Link -Set -Dev on .
ausführen
Ich arbeite mit Raw -Ethernet -Sockets und erlebe ein seltsames Problem, bei dem ein Senden /[code]send[/code]/[code]recv[/code]/[code]recv[/code]/Wiederholungsmuster kann zum endgültigen Recv auf unbestimmte Zeit blockieren. class = "Lang-C PrettyPrint-Override">[code]sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); [/code] zusammen mit dem Promiscuous -Modus auf der Schnittstelle, auf die ich sende und empfange[code]recv[/code]/Wiederholungsszenario funktioniert wie erwartet : Ich habe eine Ping/Pong und Kasten A und B sind durch ein einzelnes Ethernet -Kabel miteinander verbunden: App [b] A [/b]: [code]while (1) { // Send PING + pass sockaddr_ll with interface info sendto(...); // Block until PONG is received + logic to ignore irrelevant traffic recv(...); } [/code] App [b] B [/b]: [code]while (1) { // Block until we recv a PING + logic to ignore irrelevant traffic recv(...); // Reply with a PONG + pass sockaddr_ll with interface info sendto(...); } < /code> Wie erwähnt, funktioniert dies alles einwandfrei. Das [url=viewtopic.php?t=11587]Problem[/url] tritt auf, wenn ich App [b] a [/b] zu: änderewhile (1) { sendto(...); // PING 1 sendto(...); // PING 2 recv(...); // PONG 1 recv(...); // PONG 2? } < /code> Einige wichtige Beobachtungen: < /p>
[*] Der zweite Aufruf zu recv < /code> kann einfach unbegrenzt blockieren. Je mehr Sie es schleifen lassen, desto wahrscheinlicher wird es passieren, tritt jedoch normalerweise innerhalb der ersten 10-20 Iterationen auf. < /P> < /li> Ich dachte es Könnte nur einen schlechten Code sein, aber wenn ich die Schnittstelle in Box A mit TCPDump überwachte, wird auch TCPDump nicht berichtet, dass der Frame auf der Schnittstelle angezeigt wird. Nachdem Sie einige Sekunden gewartet und Strg+C in App A gedrückt haben, meldet das Ausführen von ifConfig [/code] einen neuen fallengelassenen Frame auf der Schnittstelle.
< LI> Ich weiß, dass Kasten B mit der Pong antwortet, weil ich die Hardware zur Netzwerküberwachung verwendet habe, um die Antworten von b -> A auf ein separates Feld C und TCPDump auf C -Berichten zu spiegeln Pong. Ich denke nicht (?) Es ist nur ein [url=viewtopic.php?t=11587]Problem[/url] mit Kasten a. der zweite recv und ich verwende Ein separates Programm zum Senden eines beliebigen nicht-pongischen Frame an derselben Schnittstelle und über die Kabel, auf die App A+B kommunizieren, und dann wird es den letzten Pong durchsetzen und App A wird auf recv aufhören zu blockieren . Ich kann dies entweder aus Kasten A oder Kasten B tun, solange es an die Schnittstelle des Subjekts gesendet wird, und es wird es immer noch "treten". Es braucht nur einen Datenverkehr, um es durchzusetzen. Schnittstelle, aber schließlich bleibt wieder stecken. > Nur App A , senden Sie diese Das erste "Ping" wird die Schnittstelle "treten" und die erste Pong, die es erhält, wird das sein, das bisher nirgends aus dem letzten Lauf zu finden war. < /p> < /li> < LI> Sendungsgeschwindigkeit kann etwas damit zu tun haben. Wenn ich die Schleife entferne und App eine von Hand wiederholt neu ausführte, wird es nicht geschehen (oder ich habe sie noch nicht gesehen). Deshalb habe ich sie auf einer Schleife. Aber logischerweise sollten auf dem Draht jeweils nur 2 Frames anhängig sein? Was ich hier erlebe? Scheint, als würden sich der Kernel oder sogar die NIC nur am Rahmen festhalten und nicht loslassen, bis etwas anderes dahinter ihn durchträgt? Ich glaube nicht, dass es Nagles Algorithmus sein kann, weil ich mich mit RAW -Ethernet -Rahmen und nicht mit TCP zu beschäftigen kann. Die Tatsache, dass selbst TCPDump nicht berichtet, dass der verlorene Rahmen umwerfend ist. Schlechte NICs auf beiden Boxen (siehe Punkt 4)? Wie kann ich das weiter debuggen? Sie müssen den Promiscuous -Modus selbst aktivieren, indem Sie IP -Link -Set -Dev on . ausführen[code]#include #include #include #include #include #include #include #include #include #include #include #include #include #include
ssize_t init_send_buffer(char *buf, size_t buf_len, char *payload, size_t payload_len, struct sockaddr_ll *sockaddr) { // Init socket with payload + `sockaddr` address info if (buf_len < ETH_HLEN + payload_len) return -1;
// Fill in `src` field memcpy(buf + ETH_ALEN, sockaddr->sll_addr, ETH_ALEN);
// Write in length field as BE uint16 (values < 1500 should be cosnidered length) uint16_t *len_ptr = (uint16_t *)(buf + (2 * ETH_ALEN)); *len_ptr = be_u16((uint16_t)payload_len);
// Copy in payload memcpy(buf + ETH_HLEN, payload, payload_len);
// Return total written length return ETH_HLEN + payload_len; }
Ich arbeite mit Raw -Ethernet -Sockets und erlebe ein seltsames Problem, bei dem ein Senden / send / recv / recv /Wiederholungsmuster kann zum endgültigen Recv auf unbestimmte Zeit blockieren. class...
Ich arbeite mit Raw -Ethernet -Sockets und erlebe ein seltsames Problem, bei dem ein Senden / send / recv / recv /Wiederholungsmuster kann zum endgültigen Recv auf unbestimmte Zeit blockieren. class...
Es gab früher eine Methode zum Lesen von Daten aus einem Socket und Speichern der empfangenen Daten in einem std :: vector .
Ein solches Beispiel kann hier gefunden werden.
Für die Bequemlichkeit...
public void displayProcess (String path) throws FileNotFoundException {
rawVideoFile = new FileInputStream(path);
yuvBuffer = new byte ;
new Thread(this::playYUVVideo).start();
}
public void...
Ich habe eine Situation, in der es praktisch wäre, eine vorhandene Funktion aufzurufen, die ein Referenzargument akzeptiert, und zwar mit einem Aufruf über eine std::function, die einen Zeiger...