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
    tom

    ClientCode, 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
    das

    execl("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 verfahren

    mfg 🙂



  • 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 Kritik 😉 bitte. :p

    mfg
    tom

    code 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


Anmelden zum Antworten