Problem mit dem Filehandler ?
-
Hi !
Bin mir jetzt nicht sicher ob das in die rubrik C oder Linux gehört. Naja, habe jedenfalls folgenden Fehler. Ich habe ein Programm geschrieben, das einen Server aufruft (execl) und anschließend, mit diesem kommunizieren will. Der neue Prozess (Server) bekommt beim Aufruf von execl einen Dateinamen mit übergeben, den der Server als Datei öffnen soll. Der Name wird korrekt übergeben. Aber dann hört das Prog einfach auf. Ob es abbricht oder was, das kann ich nicht sagen. Über Hilfe würde ich mich sehr freuen.
mfg
tomClientCode, der else Block in dem execl aufgerufen wird
} else { //childProcess printf("Client: argv: %s \n", argv[argc-1]); execl("fileReader", argv[argc-1]); }
ServerCode:
#include <netinet/in.h> //INADDR_ANY,sockaddr_in #include <sys/socket.h> //socket, bind ... #include <stdio.h> // filehandling #include <stdlib.h> // exit int main(int argc, char **argv) { int socketID, clientID; struct sockaddr_in serveraddr; if( (socketID = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { printf("Server: Error creating the socket"); exit(1); } printf("Server: Habe socket erzeugt....\n"); //configure the server's address properties serveraddr.sin_family = AF_INET; //tcp/ip v4 protocol family serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); //accept contacts from any address serveraddr.sin_port = htonl(5000); //comunicate over port 5000, this should be a free one //bind the server's address properties to the socket bind( socketID, (struct sockaddr*) &serveraddr, sizeof(serveraddr)); //the server should listen to the socket it is configured for. Waiting queue is 1 element listen(socketID, 1); printf("Server: Lausche auf Port 5000\n"); FILE *file = NULL; //FILE creates a new FileHandle /*open the file, if this fails tell the user. Note: We ONLY regard the last argument!*/ printf("Server: %s\n", argv[0]); //hier erhalte ich eine korrekte Ausgabe des Dateinamens if( (file = fopen( argv[0], "r")) == NULL ) { printf("Server: file error!\n"); exit(-1); //quit the prog } printf("Server: Datei geöffnet"); for(;;) { printf("Server: for loop"); clientID = accept(socketID, NULL, NULL); //read data from file an send to the client char c; //buffer character c char clientStatus = 'y'; //has value 'q' if the user quits the programm earlier than expected while ( ( (int) c = fgetc(file) ) != EOF && clientStatus != 'q' ) { //read one character in each pass write(clientID, c, 1); //transmit data to the client read( clientID, clientStatus, sizeof(char)); //wait for client's answer to the transmission of c } write(clientID, '\b' , 1); //inform the client, that we've reached EOF close( clientID ); } close(file); }
-
ich glaube noch zu wissen
dasexecl("fileReader", argv[argc-1]);
die Aufrufende Anwendung solange blockiert bis die Anwendung fileReader
fertig ist also beendet ist dann wird im Code deines
Aufrufers weiter verfahrenmfg
-
Das kann doch aber garnicht sein, denn ich habe doch nach dem forken zwei Prozesse, die parallel laufen.
Das sehe ich unter anderem auch daran, dass beide Prozesse abwechselnd Ausgaben in die Konsole schreiben.mfg
tom
-
Hi nochmal!
Poste hier auch mal den SourceCode des Clients. Würde mich freuen, wenn das sich jemand kompilieren würde und mir sagen könnte ob er denselben Fehler hat.
Aber nur wenn einer von Euch das machen will. Würde mich über Feedback sehr freuen. Vielleicht sollte ich noch erwähnen, dass ich leider keine Ahnung von Socketprogrammierung habe und, dass das mein erstes Prog ist, weshalb ich um gemilderte Kritikbitte. :p
mfg
tomcode des clients:
#include <stdio.h> // printf etc. #include <netinet/in.h> //INADDR_ANY, sockaddr_in #include <curses.h> //curses window toolkit #include <unistd.h> //fork, exec #include <sys/socket.h> int main(int argc, char **argv) { if(argc < 1) { printf("Error! Use: fileViewer <filename>"); exit(1); } else { int childPID; if( (childPID = fork()) > 0 ) { //parentProcess, this source code //create new socket int serverID; struct sockaddr_in serverAddr; if( ( serverID = socket(AF_INET, SOCK_STREAM, 0) ) < 0 ) { printf("Client: Error creating socket! "); exit(0); } //end if serverAddr.sin_family = AF_INET; //protocol family tcp/ip v4 serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //localhost serverAddr.sin_port = htonl(5000); // port sleep(2); printf("Client: Socket erzeugt und Adresse gebunden...\n"); if( connect( serverID, (struct sockaddr*) &serverAddr, sizeof(serverAddr)) < 0 ) { printf("Client: Error connecting to server\n"); exit(0); } //end if printf("Client: Serververbindung sollte mögl sein.\n"); initscr(); //new curses screen... //WINDOW* window = newwin(0,0, LINES, COLS); //create new curses window...(full size) char c; //buffers one character, which is transmitted by the server to the client int linesToDisplay = 0; //index variable, store the number of line already used on screen int currCols = 0; //index variable, stores the current column index number int fileStatus = 1; //stores information about the current status of the file, which is read in by fileReader while( fileStatus != 0) { read(serverID, &c, sizeof(char)); if( c != '\b') { //server sends '\b' if EOF is reached addch(c); refresh(); currCols++; if( c == '\n' || currCols == COLS) { currCols = 0; linesToDisplay++; move(linesToDisplay, 0); } if( linesToDisplay == LINES) { refresh(); move(0,0); char userInput = getch(); if( userInput == 'q') { char q = 'q'; write(serverID, &q, sizeof(char)); //inform the server, that the user wants to quit the program } linesToDisplay = 0; clear(); } //end if( linesToDisplay == LINES) char y = 'y'; write(serverID, &y , sizeof(char)); //tell the server to send the client one more character } else //else for if( c != '\b') fileStatus = 0; } getch(); //don't hide the last page for the user endwin(); //end curses mode } else { //childProcess printf("Client: argv: %s \n", argv[argc-1]); execl("fileReader", argv[argc-1]); } } //end "major" else } //end main
-
Hi folks !
ok, I got it! Also das erste Problem, war relativ merkwürdig ich hab, die Anweisung die Datei zu öffnene einfach weiter oben in den Quellcode eingfügt. Die Rechner können nun auch miteinander kommunizieren, weil ich nun die hton*-Methode richtig benutze.
h - to - n -* entspricht. Host TO Network s / l entweder s für short oder l für long. Okay, ich denke das wissen die meisten von Euch schon, aber dachte ich schreib das besser mal. Vielleicht hat ja irgend ein blutiger Anfänger wie ich, auch mal dasselbe Prob bei der Portzuweisung. Der port ist nämlich vom Typ short.
hasta luego
mfg
tom