Announcement

Collapse
No announcement yet.

Verständnisproblem bei C Programm

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verständnisproblem bei C Programm

    Hallo,
    ich muss für die Schule ein Programm schreiben, welches von der Kommandozeile eine HTML-Seite anfragt und dann den Header abschneidet und nur die reinen HTML Seite ausgibt. Jetzt habe ich auch schon das Programm fertig.

    <PRE>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>

    #include <errno.h>

    int http(const char *host, const char *service);
    int errexit(const char *format, ...);
    int connectTCP(const char *host, const char *service);

    #define LINELEN 400

    /*------------------------------------------------------------------------
    * main - TCP client for DAYTIME service
    *------------------------------------------------------------------------
    */
    int
    main(int argc, char *argv[])
    {
    char *host = "localhost"; /* host to use if none supplied */
    char *service = "www"; /* default service port */

    switch (argc) {
    case 1:
    host = "localhost";
    break;
    case 3:
    service = argv[2];
    /* FALL THROUGH */
    case 2:
    host = argv[1];
    break;
    default:
    fprintf(stderr, "usage: TCPdaytime [host [port]]\n");
    exit(1);
    }
    http(host, service);
    exit(0);
    }

    /*------------------------------------------------------------------------
    * TCPdaytime - invoke Daytime on specified host and print results
    *------------------------------------------------------------------------
    */
    http(const char *host, const char *service)
    {
    char buf[LINELEN+1]; /* buffer for one line of text */
    int s, n; /* socket, read count */
    char *request = "GET / HTTP/1.0 \n\n";
    char *temp1, *temp2, *html;
    int stringlen;
    char header[4096];
    char temp[100];
    int code;

    fd_set rfds;
    struct timeval tv;
    int retval;

    s = connectTCP(host, service);

    FD_ZERO(&rfds);
    FD_SET(s, &rfds);

    tv.tv_sec = 20;
    tv.tv_usec = 0;

    (void) write(s, request, strlen(request));

    retval = select(s+1, &rfds, NULL, NULL, &tv);

    if(retval == -1)
    {
    perror("select()");
    }

    else if(retval)
    {
    read(s, buf, LINELEN);
    /* temp1 = buf; */ /* schreibe gesamten Buffer in temp1 */
    /* temp2 = strstr(temp1, "\n\r"); */ /* Suchen nach Zeichenfolge; Zeilenumbruch und CR -> HTTP-Teil */
    /* stringlen = temp2 - temp1; */
    /* strncpy(header, temp1, stringlen);*/
    /* html = &buf[stringlen + 2];*/

    /* Codeausgabe */
    /* temp1 = strstr (header, " ");
    temp2 = strstr (++temp1, " ");
    strncpy(temp, temp1, temp2 -temp1);
    code = atoi (temp);*/ /* Zeichenkette zu Integer */

    code = 200; /* nur zum Testen wegen auskommentierung */

    printf("error code: %i\n\n", code);

    if (code == 200) /* Seite erreichbar - Ausgabe */
    {
    while (n = read(s, buf, LINELEN)) /* HTTP- Teil */
    {
    buf[n] = '\0';
    (void) fputs( buf, stdout );
    }
    }
    else
    printf("unknown error\n");
    close(s);
    }
    else
    {
    printf("time-out expired\n");
    exit(0);
    }
    }
    </PRE>

    und nun habe ich gemerkt wenn ich den größten Teil aus dem Programm auskommentiere geht es auch.
    Lediglich wenn ich die Zeile

    <PRE>
    read(s, buf, LINELEN);
    </PRE>
    rausnehme geht es nicht mehr. Aber wieso wird durch diese Teil auch schon der Header von der HTML Seite abgeschnitten?

    Hat jemand eine Idee?

  • #2
    Welche Zeile

    read(s, buf, LINELEN);

    die ist 2 x vorhanden
    Christian

    Comment


    • #3
      die erste, die die nicht in der while-Schleife ist

      Comment


      • #4
        Weil du schon 400 Bytes mit dem ersten read gelesen hast
        Christian

        Comment


        • #5
          Ich habe jetzt mal den Code etwas gändert. Und nun habe ich noch das Problem das nicht die gesammte HTML Seite angezeigt wird. Bei kleineren Seite ist das der Fall. Aber sobald die Seite etwas größer ist, wird der HTML Text dann einfach abgeschnitten. Eine Idee warum?

          <PRE>
          #include <unistd.h>
          #include <stdlib.h>
          #include <string.h>
          #include <stdio.h>

          #include <errno.h>

          int http(const char *host, const char *url, const char *service);
          int errexit(const char *format, ...);
          int connectTCP(const char *host, const char *service);

          #define LINELEN 50000
          #define HOSTLEN 255;

          /*------------------------------------------------------------------------
          * main
          *------------------------------------------------------------------------
          */
          int
          main(int argc, char *argv[])
          {
          char *service = "www"; /* verwendeter service */

          char *eingabe;
          char *phost;
          char *purl;
          int HostLaenge;

          char host[100];
          char url[100] = "/";

          switch (argc) {
          case 1:
          /* strcpy(host, "www.suse.de");*/
          /* strcpy(purl, "/");*/
          break;
          case 3:
          service = argv[2];

          case 2:
          eingabe = argv[1];
          break;
          default:
          fprintf(stderr, "usage: TCPdaytime [host [port]]\n");
          exit(1);
          }

          printf("Komplette URL (Host+Url): %s\n",eingabe);

          phost = (char *) eingabe; /* Zeiger auf Anfang der URL */

          purl = strchr(eingabe, '/'); /*Zeiger auf Pos. für URL */

          if (purl != NULL)
          {
          strcpy(url,purl); /* Start URL festlegen */
          HostLaenge = purl - phost; /* Länge des Hostnamens */
          memcpy(host, eingabe, HostLaenge); /* Hostnamen kopieren */
          host[HostLaenge] = '\0'; /* abschliessen */
          }
          else
          {
          strcpy(host, eingabe);
          }

          printf("Host: %s\n",host);
          printf("Url: %s\n",url);
          printf("Service: %s\n",service);

          http(host, url, service);
          exit(0);
          }

          /*------------------------------------------------------------------------
          * http
          *------------------------------------------------------------------------
          */
          http(const char *host, const char *url, const char *service)
          {
          char buf[200000]; /* buffer for one line of text */
          char buf_req[200000];
          int s, n; /* socket, read count */
          int code;
          char *temp1, *temp2, *htmlstart;
          char temp[LINELEN+1];
          int headerlaenge;
          char header[500];

          fd_set rfds;
          struct timeval tv;
          int retval;

          s = connectTCP(host, service);

          FD_ZERO(&rfds);
          FD_SET(s, &rfds);

          tv.tv_sec = 20;
          tv.tv_usec = 0;

          sprintf(buf_req,"GET %s HTTP/1.0\n\r\n\r",url);
          buf_req[LINELEN] = '\0';

          (void) write(s, buf_req, strlen(buf_req));

          retval = select(s+1, &rfds, NULL, NULL, &tv);

          if(retval == -1)
          {
          perror("select()");
          }

          else if(retval)
          {
          read(s, buf, LINELEN);
          temp1 = buf; /* Sicherung der Daten */
          temp2 = strstr(temp1, "\n\r"); /* Suchen der Zeichenfolge; return Adresse */
          headerlaenge = temp2 - temp1; /* Headerlaenge */
          htmlstart = &buf[headerlaenge + 2]; /* Headerlaenge + \n\r (2) schreiben in htmlstart */

          temp1 = strstr (buf, " "); /* erste Leerstelle */
          temp2 = strstr (++temp1, " "); /* zweite Leerstelle */
          strncpy( temp, temp1, temp2 - temp1); /* Code kopieren */
          code = atoi (temp);

          printf("HTML Code %i\n",code);

          if ( code == 200)
          printf("\nHTML TEIL\n%s\n",htmlstart);
          else
          printf("unknown error\n");

          close(s);
          }
          else
          {
          printf("time-out expired\n");
          exit(0);
          }
          }

          </PRE&gt

          Comment

          Working...
          X