ein Kapitel zurück                                           ein Kapitel weiter

Wir wollen nun mit unserem Empfänger den Sender antworten das wir sein Daten erhalten haben.




Solche FIFOs in einfacher Richtung sind oft ausreichend zur Datenerfassung wie Statistiken, wie sie gar in der Abrechnung der Mobilkommunikation eingesetzt werden. Nur das dort um einige mehr Clients etwas in die FIFO schreiben und der Server damit wohl recht stark beschäftigt ist. Wenn man nur bedenkt was es für den Server bedeutet wenn die Telefoneinheiten im Sekundentakt berechnet werden. Kaum zu glauben das man das noch bewerkstelligen kann ;)

Nun weiter zum Thema. Wenn man nun Anwendungen benötigt bei denen der Client anfragen an den Server schickt und der Client eine Antwort als Bestätigung benötigt um etwas auszuführen, das beste Beispiel dafür das Internet um z.B. zu überprüfen ob eine gewisse URL die man gerade eingegeben hat überhaupt existiert, können wir nicht eine einzige FIFO verwenden.

Wie sollen den die einzelnen Client wissen welche Antwort nun für sie bestimmt ist? Zuerst müssen die einzelenen Clienten (Sender) sich eine eigene FIFO einrichten, aus der sie eine Antwort vom Server lesen können.

Damit der Server auch weiß wohin mit der Antwort müssen die Clienten im eine Eindeutige Indenfikation mitschicken. Am einfachsten sind wir in einem solchem Fall mit der PID des Prozesses dran. Mit dieser PID soll der Client die Antwort-FIFO erstellen. Hat ein Client Beispielsweise die PID 1001 erstellt dieser eine FIFO namens fifo.1001.

Wollen wir uns zuerst den Client (Sender) ansehen....

/*Download:sender.c*/
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define BUF 8192 int main() { char puffer[BUF], inhalt[BUF],delete_fifo[BUF]; int fd,fdx,n; sprintf(puffer,"fifo.%d\0",getpid()); inhalt[0]='\0'; /*Erste Zeile der Nachricht enthält die PID*/ sprintf(inhalt,"%d\n",getpid()); if(mkfifo(puffer, O_RDWR|0666) < 0) { fprintf(stderr,"Konnte keine FIFO erzeugen!!\n"); exit(0); } fd=open("fifo1.1", O_WRONLY); fdx=open(puffer, O_RDWR); if(fd == -1 || fdx == -1) { perror("open : "); exit(0); } strcmp(delete_fifo, puffer); printf("Bitte geben sie Ihre Nachricht ein (Mit STRG+D beenden)\n"); while(fgets(puffer,BUF,stdin) != NULL) strcat(inhalt,puffer); write(fd,inhalt,BUF); if(read(fdx,puffer,BUF)) printf("%s\n",puffer); /*Antwort-FIFO wieder löschen*/ unlink(delete_fifo); return 0; }

Da der Server wohl schon selbst genügend zu tun hat übernimmt der Client auch wieder das Löschen der FIFO zum Emfang der Antwort vom Server. Nun wollen wir uns das Programm des Servers ansehen der alle Nachrichten von den Clienten aufnimmt und an den Drucker über eine Pipe weiterleitet. Anschließend wertet der Server die erste Zeile der Nachricht aus, und sendet eine Bestätigung an den Clienten, der Ihm diese Nachricht geschickt hat. In der ersten Zeile befindet sich ja die PID des Clienten. Hierzu nun der Quellcode des Servers............

/*Download:server.c*/
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define BUF 8192 void an_den_drucker(char *text) { FILE *p; /*Pipe zum Tool lpr erstellen zum Schreiben auf lpr*/ p=popen("lpr","w"); if(p == NULL) { fprintf(stderr,"Konnte keine Pipe zu \'lpr\' erstellen!!\n"); exit(0); } /*An den Drucker schreiben*/ printf("Sende Auftrag an den Drucker......\n"); fprintf(p, "%s", text); fflush(p); pclose(p); } int main() { char puffer[BUF], inhalt[BUF],antwort[BUF],pid[6]; int r_fd,w_fd,n,i; inhalt[0]='\0'; if(mkfifo("fifo1.1", O_RDWR) < 0) { fprintf(stderr,"Konnte keine FIFO erzeugen!!\n"); exit(0); } /*Empfänger ließt nur aus der FIFO*/ r_fd=open("fifo1.1", O_RDONLY); if(r_fd == -1) { perror("open : "); exit(0); } while(1) /*Endlosschleife*/ { if(n=read(r_fd,puffer,BUF)!=0){ an_den_drucker(puffer); /*Pid des Aufrufenden Prozesses ermitteln*/ n=0,i=0; while(puffer[n] != '\n') pid[i++]=puffer[n++]; pid[++i]='\n'; strcpy(antwort,"fifo."); strncat(antwort,pid,i); w_fd=open(antwort,O_WRONLY); if(w_fd==-1) { perror("open :"); exit(0); } write(w_fd,"Habe Ihre Anfrage soeben erhalten\n", sizeof("Habe Ihre Anfrage soeben erhalten\n")); close(w_fd); } } return 0; }

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf