2016-05-10 12 views
3

Ich werde ein Tool schreiben, das für Last-/Stresstests von VoIP-Anwendungen verwendet wird. Die meisten der getesteten Anrufe wären konferenzähnliche Anrufe, bei denen ein Client spricht und alle anderen in der Gruppe zuhören. In einem solchen Szenario empfangen Serverkopien UDP-RTP-Audiopakete an jeden empfangenden Client. In meinem Ladewerkzeug werde ich auf diese Pakete in der epoll-basierten Schleife warten.Wie entferne ich ein Paket vom UDP-Lesepuffer im Kernel?

Problem: Wenn UDP RTP-Pakete eintreffen, muss ich recvfrom anrufen, um es zu erhalten. In meinem Fall möchte ich den Inhalt dieses Pakets in den meisten Szenarien nicht verarbeiten (Paketanzahl wäre ausreichend), so dass recvfrom unnötige Daten vom Kernel in den Benutzerbereich kopiert. Für große Gruppen bedeutet das viel unnötiges Kopieren. Ist es möglich, den Kernel zu bitten, dieses Paket aus dem Empfangspuffer zu entfernen und es nicht an den Benutzerbereich zu übergeben? Oder vielleicht irgendwie umgeleitet in/dev/null im Kernel? Oder bitten Sie den Kernel, alle Pakete zu entfernen und zurückzugeben, wie viele es entfernt?

Umgebung: Linux RedHat 6 (7 wäre auch akzeptabel), x86_64, gcc.

Antwort

4

können Sie versuchen, es im User-Space zu tun:

MSG_TRUNC (seit Linux 2.2) Bei rohen (AF_PACKET), Internet-Datagramm (seit Linux 2.4.27/2.6.8), netlink (seit Linux 2.6.22) und UNIX Datagramm (seit Linux 3.4) Sockets: geben Sie die tatsächliche Länge des Pakets oder Datagramms zurück, auch wenn es länger als der übergebene Puffer war. Nicht für UNIX-Domänen-Sockets (Unix (7)) implementiert.

len = recvfrom(sock, buff, 0, MSG_TRUNC, ...); 
+0

Dank, ist es das, was ich gesucht habe :) –