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?
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?
Comment