Herakles
Profifragensteller
Moin!
Ich fahre hier gerade ein paar Netzwerktests und bin dabei auf ein Kuriosum gestoßen.
In einem kleinen C-Programm schicke ich per UDP-Paket einfach Pakete ohne nennenswerten Inhalt auf die WLAN-Schnittstelle. Die geschieht in einer Endlosscheife gemeinsam mit einem usleep(3000), also 3 ms.
Schneide ich nun mit einem nicht involviertem Netzwerkinterface den Datenverkehr mit (WLAN-Karte im Monitormodus), so bemerke ich, dass die meisten Pakete 3 ms nach dem letzten verschickt werden, einige jedoch schneller, und - viel schlimmer - einige wesentlich langsamer. So habe ich bei einem Lauf von 10 Sekunden mindestens ein Paket, das 20ms benötigt, also fast die 7-fache Zeit.
Woran mag das liegen? Der Kernel, bzw. der Treiber scheint der Flaschenhals zu sein, denn wenn ich auf der Karte mitschneide, mit der ich sende, dann erscheint jedes Paket in exakt den vorgegebenen 3 ms Abständen (Abweichung nur im Mikrosekundenbereich). Mein kleines Test-Programm möchte ich deshalb als Fehlerquelle ausschließen.
Der Vollständigkeit halber habe ich den Code unten angehängt. Und ja, es handelt sich um ein Linux-Testsystem. Da ich aber selbst gern in diesem Forum unterwegs bin und hier viele Netzwerkexperten weiß, möchte ich die Frage dennoch hier stellen. Man möge es mir verzeihen! Ich verwende Atheros-Karten. Allerdings ist dasselbe Verhalten mit Intel-ipw2200 Karten zu beobachten.
Danke im Voraus,
Herakles
Ich fahre hier gerade ein paar Netzwerktests und bin dabei auf ein Kuriosum gestoßen.
In einem kleinen C-Programm schicke ich per UDP-Paket einfach Pakete ohne nennenswerten Inhalt auf die WLAN-Schnittstelle. Die geschieht in einer Endlosscheife gemeinsam mit einem usleep(3000), also 3 ms.
Schneide ich nun mit einem nicht involviertem Netzwerkinterface den Datenverkehr mit (WLAN-Karte im Monitormodus), so bemerke ich, dass die meisten Pakete 3 ms nach dem letzten verschickt werden, einige jedoch schneller, und - viel schlimmer - einige wesentlich langsamer. So habe ich bei einem Lauf von 10 Sekunden mindestens ein Paket, das 20ms benötigt, also fast die 7-fache Zeit.
Woran mag das liegen? Der Kernel, bzw. der Treiber scheint der Flaschenhals zu sein, denn wenn ich auf der Karte mitschneide, mit der ich sende, dann erscheint jedes Paket in exakt den vorgegebenen 3 ms Abständen (Abweichung nur im Mikrosekundenbereich). Mein kleines Test-Programm möchte ich deshalb als Fehlerquelle ausschließen.
Der Vollständigkeit halber habe ich den Code unten angehängt. Und ja, es handelt sich um ein Linux-Testsystem. Da ich aber selbst gern in diesem Forum unterwegs bin und hier viele Netzwerkexperten weiß, möchte ich die Frage dennoch hier stellen. Man möge es mir verzeihen! Ich verwende Atheros-Karten. Allerdings ist dasselbe Verhalten mit Intel-ipw2200 Karten zu beobachten.
Danke im Voraus,
Herakles
Code:
#define PORT 12345
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv) {
int sock;
struct hostent *host;
char network_data;
struct sockaddr_in client_address;
struct sockaddr_in server_address;
host = gethostbyname( argv[1] );
server_address.sin_family = host->h_addrtype;
memcpy( (char *) &server_address.sin_addr.s_addr, host->h_addr_list[0], host->h_length );
server_address.sin_port = htons( PORT );
errno = 0;
sock = socket( PF_INET, SOCK_DGRAM, 0 );
if( sock == -1 ) {
printf( "socket() error: %s\n",strerror(errno));
exit( -1 );
}
client_address.sin_family = PF_INET;
client_address.sin_addr.s_addr = htonl (INADDR_ANY);
client_address.sin_port = htons( 0 );
if( bind( sock, (struct sockaddr*)&client_address, sizeof( struct sockaddr_in ) ) < 0 ) {
printf("Cannot bind socket: %s\n",strerror(errno));
exit( -1 );
}
while(1) {
usleep(3000);
if( sendto( sock, &network_data, 1, MSG_DONTWAIT, \
(struct sockaddr*)&server_address, sizeof(struct sockaddr_in) ) == -1 ) {
printf("sendto() error: %s\n",strerror(errno));
}
}
}
