1 | /***************************************************************************
|
2 | Name: getpage.c
|
3 | Autor: www.c-worker.ch
|
4 | Beschreibung: Zeigt die Antwort des Webservers auf eine bestimmte URL an
|
5 | oder lädt wahlweise die Site in eine Datei herunter.
|
6 | Return Code: 0 = ok, >0 oder <0 = Fehler
|
7 |
|
8 | ----------------------------------------------------------------------------
|
9 | Aus RFC 1945, HTTP/1.0:
|
10 | Full-Response = Status-Line
|
11 | *( General-Header
|
12 | | Response-Header
|
13 | | Entity-Header )
|
14 | CRLF (ich gehe in diesem Code davon aus es handelt sich um \x0D\x0A\x0D\x0A)
|
15 | [ Entity-Body ]
|
16 |
|
17 | ****************************************************************************/
|
18 |
|
19 | #include <windows.h>
|
20 | #include <winsock2.h>
|
21 | #include <stdio.h>
|
22 | #include <stdlib.h>
|
23 |
|
24 | void perr_exit(char* msg, int ret_code)
|
25 | {
|
26 | printf("%s, Error: ",msg);
|
27 | printf("%d\n",ret_code);
|
28 | exit(ret_code);
|
29 | }
|
30 |
|
31 | void usage(char* prgname)
|
32 | {
|
33 | printf("\nUsage:\t");
|
34 | printf("%s <URL> [<File>]\n",prgname);
|
35 | printf("\tURL: Website URL\n");
|
36 | printf("\tFile: Optional File to store the Website\n");
|
37 | exit(0);
|
38 | }
|
39 |
|
40 | int main(int argc, char** argv)
|
41 | {
|
42 | char* url;
|
43 | char* site;
|
44 | char* host;
|
45 | char buf[1024];
|
46 | char send_buf[256];
|
47 | char recv_buf[256];
|
48 | long rc;
|
49 | FILE* target_file;
|
50 | char uses_file=0;
|
51 | char* write_ptr;
|
52 | SOCKET s;
|
53 | SOCKADDR_IN addr;
|
54 | WSADATA wsa;
|
55 | HOSTENT* hent;
|
56 |
|
57 | if(WSAStartup(MAKEWORD(2,0),&wsa))
|
58 | perr_exit("WSAStartup failed",WSAGetLastError());
|
59 |
|
60 | addr.sin_family=AF_INET;
|
61 | addr.sin_port=htons(80);
|
62 |
|
63 | if(argc<2)
|
64 | {
|
65 | printf("\nURL: ");
|
66 | scanf("%s",buf);
|
67 | url=buf;
|
68 | }
|
69 | else
|
70 | {
|
71 | if(strcmp(argv[1],"/?")==0 ||
|
72 | strcmp(argv[1],"/help")==0 ||
|
73 | strcmp(argv[1],"/h")==0 ||
|
74 | strcmp(argv[1],"--help")==0 ||
|
75 | strcmp(argv[1],"-h")==0)
|
76 | usage(argv[0]);
|
77 |
|
78 | url=argv[1];
|
79 | }
|
80 | if(argc>2)
|
81 | {
|
82 | if(!(target_file=fopen(argv[2],"w")))
|
83 | {
|
84 | printf("Cannot open File ");
|
85 | perr_exit(argv[2],GetLastError());
|
86 | }
|
87 | uses_file=1;
|
88 | }
|
89 |
|
90 | if(strncmp("http://",url,7)==0)
|
91 | host=url+7;
|
92 | else
|
93 | host=url;
|
94 |
|
95 | if((site=strchr(host,'/'))!=0)
|
96 | *site++='\0';
|
97 | else
|
98 | site=host+strlen(host); /* \0 */
|
99 |
|
100 | printf("Host: %s\n",host);
|
101 | printf("Site: %s\n",site);
|
102 | printf("Connecting....\n");
|
103 |
|
104 | if((addr.sin_addr.s_addr=inet_addr(host))==INADDR_NONE)
|
105 | {
|
106 | if(!(hent=gethostbyname(host)))
|
107 | perr_exit("Cannot resolve Host",WSAGetLastError());
|
108 |
|
109 | strncpy((char*)&addr.sin_addr.s_addr,hent->h_addr,4);
|
110 |
|
111 | if(addr.sin_addr.s_addr==INADDR_NONE)
|
112 | perr_exit("Cannot resolve Host",WSAGetLastError());
|
113 | }
|
114 |
|
115 | if((s=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
|
116 | perr_exit("Cannot create Socket",WSAGetLastError());
|
117 |
|
118 | if( connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)))
|
119 | perr_exit("Cannot connect",WSAGetLastError());
|
120 |
|
121 | printf("Connected to %s...\n",host);
|
122 |
|
123 |
|
124 | sprintf(send_buf,"GET /%s HTTP/1.0\r\n\r\n",site);
|
125 |
|
126 | // sprintf(send_buf,"GET /%s HTTP/1.0\nUser-Agent:www.google.com\n\n",site);
|
127 |
|
128 | if((send(s,send_buf,strlen(send_buf),0))<strlen(send_buf))
|
129 | perr_exit("Cannot send Data",WSAGetLastError());
|
130 |
|
131 | if(uses_file)
|
132 | printf("Downloading Page to File %s...",argv[2]);
|
133 | else
|
134 | printf("----Result----\n");
|
135 |
|
136 | while((rc=recv(s,recv_buf,255,0))>0)
|
137 | {
|
138 | recv_buf[rc]='\0';
|
139 | if(uses_file)
|
140 | {
|
141 | if(uses_file==1)
|
142 | {
|
143 | /* web server info nicht in Datei speichern */
|
144 | if((write_ptr=strstr(recv_buf,"\x0D\x0A\x0D\x0A"))>0)
|
145 | {
|
146 | uses_file=2;
|
147 | write_ptr+=4;
|
148 | }
|
149 | }
|
150 | else
|
151 | write_ptr=recv_buf;
|
152 | if(uses_file==2)
|
153 | {
|
154 | if( fwrite(write_ptr,1, rc-(write_ptr-recv_buf), target_file)<rc-(write_ptr-recv_buf))
|
155 | fclose(target_file);
|
156 | }
|
157 | }
|
158 | else /* uses_file */
|
159 | printf("%s",recv_buf);
|
160 | }
|
161 |
|
162 | printf("\nDONE!");
|
163 | if(uses_file)
|
164 | fclose(target_file);
|
165 | closesocket(s);
|
166 | return 0;
|
167 | }
|