Echoserver und nun noch die time-Funktion rein



  • moin. also du meinst so....

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <time.h>

    #define ABFRAGE "time" /* neu */

    int echofunk(int s);
    int zeit(int s) /* neu */

    int echofunk(int s)
    {
    ssize_t bytes;
    char buffer[150];

    memset(buffer, '\0', sizeof(buffer));

    while( (bytes = read(s, buffer, sizeof(buffer))) > 0)
    {
    if(strncmp(buffer,ABFRAGE, strlen(ABFRAGE)) == 0) /* neu /
    zeit(s); /
    neu */

    buffer[bytes] = '\0';
    if(write(s, buffer, sizeof(buffer)) != sizeof(buffer))
    return -1;
    memset(buffer,'\0',sizeof(buffer));
    }
    }

    int zeit(int s) /* neu */
    {

    }

    int main(void)
    {
    int s, c;
    size_t addr_len;
    struct sockaddr_in addr;
    pid_t childpid;

    memset(&addr, '\0',sizeof(addr));
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(4000);
    addr.sin_family = AF_INET;

    s = socket(AF_INET, SOCK_STREAM, 0);

    bind(s, (struct sockaddr *)&addr, sizeof(addr));

    listen(s, 1);

    while (1>0)
    {
    addr_len = sizeof(addr);
    c = accept(s, (struct sockaddr *)&addr, &addr_len);
    if (c == -1)
    {
    printf("FEHLER accept\n C=%d",c);
    exit(-1);
    }
    else
    {
    echofunk(c);
    }
    }
    }

    jetzt würde doch das prog überprüfen ob das Wort time vorkommt oder?
    und wenn ja soll die uhrzeit ausgegeben werden, aber das bekomme ich irgendwie mit der write anweisung net hin 😞



  • Du musst deiner Funktion zeit() auch noch buffer übergeben, schließlich muss der Inhalt geändert werden, damit write() auch wirklich die Zeit zurückgibt und nicht den eingelesenen String. In der Funktion zeit() brauchst du einfach nur das aktuelle Datum und die Uhrzeit in buffer schreiben (am besten wohl mit sprintf()). Die Datums- und Zeitfunktionen findest du hier.

    Und verwende bitte in Zukunft die C/C++ Tags (gleich unter dem ersten Smily) für deinen Code. Dadurch wird das ganze um einiges leserlicher.



  • int zeit(int s)                                             
    {                                                           
     char buff[150];                                            
     time_t ticks;                                              
    
     ticks = time(NULL);                                        
     sprintf(buff, sizeof(buff), "%s", ctime(ticks)); 
     write(s, buff strlen(buff));          
     return 0;                                                  
    }
    

    meinst also so müsste die funktion zeit aussehen oder wie?

    ich stell mich bestimmt voll blöde an oder? 😃



  • Nein, so meinte ich das nicht. Das ermitteln der Zeit und das Umwandeln in einen String ist richtig (nur der Aufruf von sprintf() nicht oder verwendest du snprintf()?). Du solltest eigentlich buffer von echofunk() als Parameter an zeit() übergeben ( zeit(char * buff); s brauchst du gar nicht, da du ja write außerhalb von zeit() in echofunk() verwendest. ). Nach dem Aufruf von zeit() sollte also in buffer nicht mehr "time" stehen, sondern das aktuelle Datum und die Uhrzeit.



  • okay ich glaube ich bin wirklich nen bissel blöd..... 🙂

    ich habe so gut wie gar nichts ebend verstanden 🙂

    int zeit(char buffer)                                             
    {                                                                               time_t ticks;                                              
     ticks = time(NULL);    
    
     sprintf(buffer, sizeof(buffer), "%s", ctime(ticks));      
     return 0;                                                  
    }
    

    so würde ich das jetzt verstehen....
    danke sschon mal 🙄



  • So stimmt es.

    int zeit(char * buffer)
    {
       time_t ticks;
       ticks = time(NULL);    
    
       sprintf(buffer, "%s", ctime(ticks));
       return 0;
    }
    


  • naja hatte es ja fast richtig bei meinem letzten versuch 😃

    also sie server funktion funzt aber wenn ich "time" eingebe kommt buserror...
    kann das vielleicht mit der warnung:

    test.c 26: [warning]: CFE1167 Argument des Typs "int" ist unvertraeglich m
    t Parameter des Typs "char *"
    zeit(s);
    ^

    test.c 33: [warning]: CFE1117 Nicht-void function "echofunk" (declared at
    ine 16) sollte einen Wert zurueckliefern
    }
    ^

    test.c 40: [warning]: CFE1167 Argument des Typs "time_t" ist unvertraeglich
    mit Parameter des Typs "const time_t *"
    sprintf(buffer, "%s", ctime(ticks));

    zu tun haben?

    hier der theoretisch fertige code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <time.h>
    #define ABFRAGE "time"
    
    int echofunk(int s);
    int zeit(char * buffer);
    
    int echofunk(int s)
    {
      ssize_t bytes;
      char buffer[150];
    
      memset(buffer, '\0', sizeof(buffer));
    
      while( (bytes = read(s, buffer, sizeof(buffer))) > 0)
      {
        if(strncmp(buffer,ABFRAGE, strlen(ABFRAGE)) == 0)
          zeit(s);
    
        buffer[bytes] = '\0';
        if(write(s, buffer, sizeof(buffer)) != sizeof(buffer))
          return -1;
        memset(buffer,'\0',sizeof(buffer));
      }
    }
    
    int zeit(char * buffer)
    {
       time_t ticks;
       ticks = time(NULL);
    
       sprintf(buffer, "%s", ctime(ticks));
       return 0;
    }                                                                  
    
    int main(void)
    {
            int s, c;
            size_t addr_len;
            struct sockaddr_in addr;
            pid_t childpid;
    
            memset(&addr, '\0',sizeof(addr));
            addr.sin_addr.s_addr = INADDR_ANY;
            addr.sin_port = htons(4000);
            addr.sin_family = AF_INET;
    
            s = socket(AF_INET, SOCK_STREAM, 0);
    
            bind(s, (struct sockaddr *)&addr, sizeof(addr));
    
            listen(s, 1);
    
            while (1>0)
            {
                    addr_len = sizeof(addr);
                    c = accept(s, (struct sockaddr *)&addr, &addr_len);
                    if (c == -1)
                    {
                     printf("FEHLER accept\n C=%d",c);
                     exit(-1);
                    }
                    else
                    {
                     echofunk(c);
                    }
            }
    }
    

    ^



  • keiner mehr da?

    @Aj danke erstmal für die hilfe...wäre wirklich cool wenn du mir in dem falle jetzt noch weiterhelfen könntest 😃



  • dann beseitige doch die warnungen.
    1. zeit(buffer) statt zeit(s)
    2. echofunk muss einen int return wert liefern (1 oder die länge der des buffer)
    3. deklariere und init. deine ticks var. in zeit
    const time_t = time(NULL);

    der erste fehler ist jedenfalls richtig fatal.

    cu



  • thx an alle die geholfen haben...

    funzt einwandfrei 😃


Anmelden zum Antworten