http://www.pronix.de -> Forum -> Linux-Unix Programmierung

Forum: Linux-Unix Programmierung

Moderatoren: juergen, Martin Conrad

Thema: [EDIT] - Multicast im WLAN verzögert

  • (nur registrierte Mitglieder)
Hallo!

Ich habe wie im Buch "Linux-UNIX-Programmierung" auf den Seiten 502 bis 505 beschrieben einen Multicast Socket aufgezogen. Nun nutze ich das unten angehängte Programm, um für einen Funktionstest alle 2ms ein Datenpaket von rund 800 Bytes zu versenden. Wenn ich mir mit einem nebenstehenden Rechner im 2,4GHz WLAN anschaue, in welchem Interval die Pakete versendet werden, so bemerke ich Abstände zwischen den Paketen von etwa 7ms, auch wenn ich dem Programm als Parameter 2ms zwischen den Paketen mitgebe.

Das Interessante ist nun, dass diese Verzögerung bei der Nutzung von Unicast (in meinem Fall wurde ein Test mit der 10.0.0.3 durchgeführt) NICHT auftritt. Die Messungen mit dem nebenstehenden Laptop im WLAN zeigen zu erwartendende Werte um die 2ms ohne wesentliche, größere Ausbrüche.

Wie kann das sein? Wo könnte mein Fehler liegen?

Im Voraus Danke für jegliche Hilfestellung.

Viele Grüße
Herakles

Hier der Code:

#include <sys/types.h>       
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>     
#include <errno.h>
#include <linux/ip.h>
#include <string.h>
#include <stdlib.h>
#define MULTICAST_IP			"224.0.0.1"
#define PORT				12345
    
struct sockaddr_in server_address;
int fd_socket;

int init_connection_client( void ) {
	int sock;
socklen_t len;

	errno = 0;
	//create a socket
	sock = socket( PF_INET, SOCK_DGRAM, 0 );
	if( sock == -1 ) {
		printf("%s:%u socket() error (%s), error-code: %d\n", __FILE__, __LINE__, strerror(errno), sock);
		exit(EXIT_FAILURE);
	}
	server_address.sin_family = PF_INET;
	server_address.sin_addr.s_addr = inet_addr( MULTICAST_IP );
	server_address.sin_port = htons( PORT );
	
	return sock;
}
int send_data( unsigned char *network_data, size_t len ) {
	if( sendto( fd_socket, network_data, len, MSG_DONTWAIT, \
		(struct sockaddr*)&server_address, sizeof(struct sockaddr_in) ) == -1 ) {
			printf("%s:%u sendto() error (%s), error-code: %d\n", __FILE__, __LINE__, strerror(errno), errno);
			return errno;
	}

	return 0;
}

#define BYTE_PRO_MS 384
int main(int argc, char **argv) {
  unsigned char *data_for_transmission;
  int sleeper=atoi(argv[1]);
  int run=0;
  int datasize=0;
  
  printf("%d\n",sleeper);
  data_for_transmission = malloc( 30000 );
  fd_socket=init_connection_client();
  datasize=sleeper / 1000 * BYTE_PRO_MS;
  while(1) {
	if( send_data( data_for_transmission, datasize ) != 0 ) {
	  printf("sleep for 3\n");
		sleep(3);
		sleeper+=1000;
		datasize+=BYTE_PRO_MS;
	}
	run++;
	printf("run: %d sleep: %d, datasize: %d\n",run, sleeper, datasize);
	usleep(sleeper);
  }
 return 0;
}
 

Re: Multicast im WLAN verzögert

Patrick am 26.06.2010 um 10:37

http://de.wikipedia.org/wiki/Multicast

Könnte die Netzlast das Problem sein?
Zitat:
Handelt es sich um paketorientierte Datenübertragung, findet die Vervielfältigung der Pakete an jedem Verteiler (Switch, Router) auf der Route statt.


Oder kommt es bei der Multicast-Adresse zu konflikten?
Zitat:
Die Adressen von 224.0.0.0 bis 224.255.255.255 sind für Routingprotokolle reserviert und für diese Adressen sendet der Router keine IP-Multicast-Datagramme. Die Adressen von 239.0.0.0 bis 239.255.255.255 sind für scoping reserviert, eine Weiterleitung innerhalb dieses Adressbereichs ist ebenfalls Switch abhängig. Adressen im Bereich 225.x.x.x bis 238.x.x.x sind frei verfügbar.

--
To follow the path: look to the master, follow the master, walk with the master, see through the master, become the master.

 
Inzwischen bin ich so weit, dass ich ein Problem im WLAN vermute. Hier mal ein Link zum Thema "Multicasting im WLAN:"

Multicasting on WLAN (externer link)

Dort steht unter anderem, dass bei Multicasting wohl ein Powersave aktiviert wird, was in der Form beim Unicast nicht der Fall ist. Witzig ist dann nur noch, wieso genau dieser Powersave mode im 802.11a-Band nicht aktiv ist, denn dort beobachte ich keinerlei Probleme wie hier beschrieben.

Grüße

Herakles
 
  • (nur registrierte Mitglieder)