2012-04-08 11 views
6

Ich mache ein Programm, das einen RAW-Socket erstellt, um den gesamten Verkehr zu lesen. Zwischen dem Aufruf von socket() und recvfrom() (der letzte ist in einer Schleife, um alle Pakete aus dem Puffer zu bekommen) warte ich 5s.Warum ändert sich der Wert von SO_RCVBUF nicht?

Wenn ich das Programm ausführen, sende ich etwa 200 Pakete mit hping3 Befehl im «schnelleren Modus» (um den Puffer schnell füllen) zu meinem Programm. Sobald 5s verstrichen sind, extrahiert mein Programm etwa 150 Pakete aus dem Puffer.

Ich versuche, die Größe des Empfangspuffers zu ändern, um bessere Ergebnisse zu erhalten:

int a = 65535; 
if ((setsockopt(sockfd, 0, SO_RCVBUF, &a ,sizeof(int))) < 0) 
{ 
    fprintf(stderr, "Error setting sock opts..\n"); 
} 

jedoch, was auch immer der Wert von «a», 1 oder 10 Millionen, so scheint es ändert sich nichts, ich bekomme immer noch ~ 150 Pakete aus dem Puffer.

Was ist das Problem?

Edit: Wert von «a» wird mit einem getsockopt Aufruf verifiziert.

+0

Können Sie uns mehr Code zeigen, einschließlich relevanter Aufrufe von 'socket()' usw.? Informieren Sie uns auch über Ihr Betriebssystem. –

+0

Sicher, ich führe dieses Programm unter Linux 3.2 64bits. Der Aufruf von 'socket()': 'sockfd = socket (AF_INET, SOCK_RAW, IPPROTO_TCP)' – Flow

Antwort

7

Das level Argument setsockopt sollte SOL_SOCKET, nicht 0:

int a = 65535; 
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &a, sizeof(int)) == -1) { 
    fprintf(stderr, "Error setting socket opts: %s\n", strerror(errno)); 
} 
+0

Danke, es funktioniert gut der Wert ändert sich jetzt. Jedoch ist die Grenze des Empfangspuffers 262142, und wenn ein Paket 50 Bytes groß ist, dann sollten ungefähr 5200 Pakete im Speicher vorhanden sein und nicht nur 150? – Flow

+0

(behoben, siehe unten) – Flow

13

Sie auch durch das Betriebssystem beschränkt werden kann, wenn es noch nicht zu funktionieren scheint. Überprüfen Sie die Werte in:

/proc/sys/net/core/rmem_default 
/proc/sys/net/core/rmem_max 

Wenn es TCP ist, wie Sie in Ihrem Beispiel sagen, und nicht wirklich eine Raw-Socket, können Sie auch die Werte überprüfen in:

/proc/sys/net/ipv4/tcp_mem 

Wenn Sie laufen Katze auf diese Dateien zeigen sie Ihnen die aktuellen Einstellungen. Um sie dauerhaft zu ändern, verwenden Sie sysctl. Es empfiehlt sich, diese Einstellungen zu notieren, bevor Sie Änderungen vornehmen. Hier ist ein großartiges Tutorial, um diese Änderungen vorzunehmen: http://fasterdata.es.net/fasterdata/host-tuning/linux/.

+0

Danke auch, ich habe den rmem_max Wert erhöht und es funktioniert sehr gut Ich kann alle Pakete bekommen. – Flow

+0

Sie haben eine Ahnung von Windows, wo wir diese Werte überprüfen können? – sreepurna