Ветеран
Сообщения: 1405
Благодарности: 135
|
Профиль
|
Отправить PM
| Цитировать
Попытался автоматически получить страницу. Сервер выдает 408 request timeout. Не знаю, как быть
Код: 
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma comment (lib, "wsock32.lib")
// буфер
struct buf
{
unsigned char* buf1;
int n;
buf() { n = 0; buf1 = NULL; }
~buf() { if (buf1) delete buf1;}
buf(int i) { buf1 = new unsigned char[i+1]; buf1[i] = '\0'; n = i; }
void add0(unsigned char a) { buf1 = new unsigned char[2]; buf1[0] = a; buf1[1] = '\0'; n = 1; }
void add(unsigned char a) { if (n == 0) { add0(a); print(); return; } int i; unsigned char* buf2 = new unsigned char[n+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; buf2[n] = a; buf2[n+1] = '\0'; n = n+1; delete [] buf1; buf1 = buf2; print(); }
void add10(unsigned char* a, int n1) { int i; buf1 = new unsigned char[n1+1]; for(i=0;i<n1;i++) buf1[i] = a[i]; buf1[n1] = '\0'; n = n1; }
void add1(unsigned char* a, int n1) { if (n == 0) { add10(a, n1); print(); return; } int i, j; unsigned char* buf2 = new unsigned char[n + n1+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; for(i=n,j=0;j<n1;j++, i++) buf2[i] = a[j]; buf2[n+n1] = '\0'; n = n + n1; printf("%d\n", n);delete [] buf1; buf1 = buf2; print(); }
int len(unsigned char* a) { int n; int i; n = 0; for(i=0; a[i]!='\0'; i++) n++; return n; }
void add1(unsigned char* a) { int n1 = len(a); if (n == 0) { add10(a, n1); print(); return; } int i, j; unsigned char* buf2 = new unsigned char[n + n1+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; for(i=n,j=0;j<n1;j++, i++) buf2[i] = a[j]; buf2[n+n1] = '\0'; n = n + n1; printf("%d\n", n);delete [] buf1; buf1 = buf2; print(); }
void print() { if (buf1) { int i; for(i=0;i<n;i++) printf("%c", buf1[i]); printf("\n"); } }
};
// HTTP-запрос
struct request
{
buf* t;
request() { t = 0; }
~request() { if(t) delete t; }
};
// адрес
struct address
{
buf* t;
address() { t = 0; }
~address() { if(t) delete t; }
};
// ссылка
struct link
{
buf* t;
link() { t = 0; }
~link() { if(t) delete t; }
};
// HTTP-ответ
struct response
{
buf* t;
response() { t = 0; }
~response() { if(t) delete t; }
};
// загрузчик
struct loader
{
WSADATA data;
SOCKET sock;
SOCKADDR_IN sockaddr;
PHOSTENT phe;
int i;
response* a;
char buf1[1024];
address* b;
request* c;
loader()
{
a = 0;
b = 0;
c = 0;
}
void create_object()
{
if (!a)
{
a = new response;
a->t = new buf;
}
if(!b)
{
b = new address;
b->t = new buf;
}
if (b->t)
b->t->add1( (unsigned char* ) "steampowered.com\0" ); // problem 0: don't know why explicit conversion: (unsogned char* )
else
exit(0);
if (!(b->t))
exit(0);
}
void socket_startup()
{
WSAStartup(0x101, &data);
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == 0)
exit(0);
}
void create_address()
{
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(80);
if (b->t)
phe = gethostbyname((char * )b->t->buf1);
else
exit(0);
memcpy((char FAR*)&(sockaddr.sin_addr), phe->h_addr, phe->h_length);
}
void socket_connect()
{
connect(sock, (PSOCKADDR) &sockaddr,sizeof(sockaddr));
}
void create_request()
{
c = new request;
c->t = new buf;
c->t->add1( (unsigned char* ) "GET /\nHost: \0");
c->t->add1( (unsigned char* ) b->t->buf1, b->t->len(b->t->buf1));
c->t->add1( (unsigned char* ) "\n\n\0");
}
void socket_send()
{
send(sock, (char *) c->t->buf1, 21, NULL);
}
void socket_shutdown()
{
WSACleanup();
}
void socket_recv()
{
while (recv(sock, buf1, 1024, NULL))
{
printf("%s\n",buf1);
for(i=0; buf1[i] != '\0' && i < 1024; i++)
;
a->t->add1( (unsigned char* ) buf1, i+1);
}
}
void main() {
create_object();
socket_startup();
create_address();
socket_connect();
create_request();
socket_send();
socket_recv();
socket_shutdown();
}
};
int main()
{
loader x;
x.main();
return 0;
}
Загрузчик пишется примерно следующим образом
Код: 
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma comment (lib, "wsock32.lib")
// буфер
struct buf
{
unsigned char* buf1;
int n;
buf() { n = 0; buf1 = 0; }
~buf() { if (buf1) delete buf1;}
buf(int i) { buf1 = new unsigned char[i+1]; buf1[i] = '\0'; n = i; }
void add0(unsigned char a) { buf1 = new unsigned char[2]; buf1[0] = a; buf1[1] = '\0'; n = 1; }
void add_(unsigned char a) { if (n == 0) { add0(a); return; } int i; unsigned char* buf2 = new unsigned char[n+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; buf2[n] = a; buf2[n+1] = '\0'; n = n+1; delete [] buf1; buf1 = buf2; }
void add(unsigned char a) { if (n == 0) { add0(a); print(); return; } int i; unsigned char* buf2 = new unsigned char[n+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; buf2[n] = a; buf2[n+1] = '\0'; n = n+1; delete [] buf1; buf1 = buf2; print(); }
void add10(unsigned char* a, int n1) { int i; buf1 = new unsigned char[n1+1]; for(i=0;i<n1;i++) buf1[i] = a[i]; buf1[n1] = '\0'; n = n1; }
void add1_(unsigned char* a, int n1) { if (n == 0) { add10(a, n1); return; } int i, j; unsigned char* buf2 = new unsigned char[n + n1+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; for(i=n,j=0;j<n1;j++, i++) buf2[i] = a[j]; buf2[n+n1] = '\0'; n = n + n1; delete [] buf1; buf1 = buf2; }
void add1(unsigned char* a, int n1) { if (n == 0) { add10(a, n1); print(); return; } int i, j; unsigned char* buf2 = new unsigned char[n + n1+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; for(i=n,j=0;j<n1;j++, i++) buf2[i] = a[j]; buf2[n+n1] = '\0'; n = n + n1; printf("%d\n", n);delete [] buf1; buf1 = buf2; print(); }
int len(unsigned char* a) { int n; int i; n = 0; for(i=0; a[i]!='\0'; i++) n++; return n; }
void add1_(unsigned char* a) { int n1 = len(a); if (n == 0) { add10(a, n1); return; } int i, j; unsigned char* buf2 = new unsigned char[n + n1+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; for(i=n,j=0;j<n1;j++, i++) buf2[i] = a[j]; buf2[n+n1] = '\0'; n = n + n1; delete [] buf1; buf1 = buf2; }
void add1(unsigned char* a) { int n1 = len(a); if (n == 0) { add10(a, n1); print(); return; } int i, j; unsigned char* buf2 = new unsigned char[n + n1+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; for(i=n,j=0;j<n1;j++, i++) buf2[i] = a[j]; buf2[n+n1] = '\0'; n = n + n1; printf("%d\n", n);delete [] buf1; buf1 = buf2; print(); }
void print() { if (buf1) { int i; for(i=0;i<n;i++) printf("%c", buf1[i]); printf("\n"); } }
void print1()
{
struct link* fg;
int state = 0;
buf* link1 = new buf;
int f;
f = 0;
int k;
k = 0;
if (buf1)
{
int i;
for(i=0;i<n;i++)
{
if (buf1[i] == '>')
printf("%c\n", buf1[i]);
else if (buf1[i] == '<')
printf("\n%c", buf1[i]);
else if (buf1[i] == '=')
printf(" %c ", buf1[i]);
else
{
if (buf1[i] == 'h' && f == 0)
f++;
else if (buf1[i] == 't' && f == 1)
f++;
else if (buf1[i] != 't' && f == 1)
f=0;
else if (buf1[i] == 't' && f == 2)
f++;
else if (buf1[i] != 't' && f == 2)
f=0;
else if (buf1[i] == 'p' && f == 3)
f++;
else if (buf1[i] != 'p' && f == 3)
f=0;
else if (buf1[i] == ':' && f == 4)
f++;
else if (buf1[i] != ':' && f == 4)
f=0;
else if (buf1[i] == '/' && f == 5)
f++;
else if (buf1[i] != '/' && f == 5)
f=0;
else if (buf1[i] == '/' && f == 6)
f++;
else if (buf1[i] != '/' && f == 6)
f=0;
if (buf1[i] == '"' && f == 7)
{
FILE* f1;
char atr[15];
sprintf(atr, "atr%d\0", k);
f1 = fopen(atr, "w");
fprintf(f1, "%s", link1->buf1);
fclose(f1);
delete link1;
link1 = new buf;
k++;
f = 0;
}
if (f == 7)
{
link1->add_(buf1[i]);
}
printf("%c", buf1[i]);
}
}
printf("\n");
}
}
};
// HTTP-запрос
struct request
{
buf* t;
request() { t = 0; }
~request() { if(t) delete t; }
};
// адрес
struct address
{
buf* t;
address() { t = 0; }
~address() { if(t) delete t; }
};
// HTTP-ссылка
struct link
{
buf* t;
link* next;
buf* host;
buf* page;
link() { t = 0; next = 0; host = 0; page=0; }
link(buf* p) { next = 0; t = new buf; t->add1_(p->buf1); host = 0; page=0; }
~link() { if(t) delete t; }
void add(struct buf *p) { t = new buf; t->add1_(p->buf1); }
void add_next(struct buf *p) { link* y = this; while(y->next) y = y->next; y->next = new link(p); }
void print() { printf("link: "); t->print(); if(next) next->print();}
void print1(buf* u)
{
buf* link1 = new buf;
int i;
int f;
int k;
int state;
f = 0;
k = 0;
if (!t) state = 0;
else state = 1;
if (u->buf1)
{
for(i=0;i<u->len(u->buf1);i++)
{
if (u->buf1[i] == '>') ; else if (u->buf1[i] == '<') ; else if (u->buf1[i] == '=') ;
else
{
if (u->buf1[i] == 'h' && f == 0) f++;
else if (u->buf1[i] == 't' && f == 1) f++; else if (u->buf1[i] != 't' && f == 1) f=0;
else if (u->buf1[i] == 't' && f == 2) f++; else if (u->buf1[i] != 't' && f == 2) f=0;
else if (u->buf1[i] == 'p' && f == 3) f++; else if (u->buf1[i] != 'p' && f == 3) f=0;
else if (u->buf1[i] == ':' && f == 4) f++; else if (u->buf1[i] != ':' && f == 4) f=0;
else if (u->buf1[i] == '/' && f == 5) f++; else if (u->buf1[i] != '/' && f == 5) f=0;
else if (u->buf1[i] == '/' && f == 6) f++; else if (u->buf1[i] != '/' && f == 6) f=0;
if (u->buf1[i] == '"' && f == 7)
{
if (state == 0) { add(link1); state = 1; }
else add_next(link1);
delete link1;
link1 = new buf;
k++;
f = 0;
}
if (f == 7) link1->add_(u->buf1[i]);
}
}
}
}
void _host()
{
int state = 0;
int i;
host = new buf;
page = new buf;
for(i=0; i<t->len(t->buf1); i++)
{
if (state == 0 && t->buf1[i] == '/') { state = 1; }
else if (state == 1 && t->buf1[i] != '/') { printf("%c", t->buf1[i]); host->add_(t->buf1[i]); }
else if (state == 1 && t->buf1[i] == '/') { state = 2; }
else if (state == 1 && t->buf1[i] == ' ') { state = 3; delete page; page = 0; }
else if (state == 1 && t->buf1[i] == '\x0d') { state = 3; delete page; page = 0; }
else if (state == 2) { state = 4; printf("%c", t->buf1[i]); page->add_(t->buf1[i]);}
else if (state == 4) { printf("%c", t->buf1[i]); page->add_(t->buf1[i]);}
}
if (state == 1 || state == 2)
{
delete page; page = 0;
}
if (host)
{
printf("host: ");
host->print();
printf("\n");
}
if (page)
{
printf("page: ");
page->print();
printf("\n");
}
}
};
// HTTP-ответ
struct response
{
buf* t;
response() { t = 0; }
~response() { if(t) delete t; }
};
// загрузчик
struct loader
{
WSADATA data;
SOCKET sock;
SOCKADDR_IN sockaddr;
PHOSTENT phe;
int i;
response* a;
char buf1[1024];
address* b;
request* c;
link* d;
loader() { a = 0; b = 0; c = 0; d = 0; }
void create_object(unsigned char* addr) { if (!a) { a = new response; a->t = new buf; } if(!b) { b = new address; b->t = new buf; } if(!d) { d = new link; } if (b->t) b->t->add1( (unsigned char* ) addr ); }
void create_address(unsigned char* addr) { sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons(80); phe = gethostbyname((char * ) addr); memcpy((char FAR*)&(sockaddr.sin_addr), phe->h_addr, phe->h_length); }
void create_request(buf* p, buf* p1) { if (c) delete c; c = new request; c->t = new buf; c->t->add1( (unsigned char* ) "GET /\0"); if (p1) c->t->add1( (unsigned char* ) p1->buf1, p1->len(p1->buf1)); c->t->add1( (unsigned char* ) "\nHost: \0"); c->t->add1( (unsigned char* ) p->buf1, p->len(p->buf1)); c->t->add1( (unsigned char* ) "\n\n\0"); }
void socket_startup() { WSAStartup(0x101, &data); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == 0) exit(0); }
void socket_connect() { connect(sock, (PSOCKADDR) &sockaddr,sizeof(sockaddr)); }
void socket_send() { send(sock, (char *) c->t->buf1, c->t->len(c->t->buf1), NULL); }
void socket_shutdown() { WSACleanup(); }
void socket_recv()
{
int state;
state = 0;
while (recv(sock, buf1, 1024, NULL))
{
printf("%s\n",buf1);
for(i=0; buf1[i] != '\0' && i < 1024; i++);
a->t->add1_( (unsigned char* ) buf1, i+1);
}
d->print1(a->t);
d->print();
delete a->t;
a->t = new buf;
}
void get_links()
{
printf("get_links\n");
link* cl = d;
cl->_host();
while(cl->next)
{
socket_startup();
create_address(cl->host->buf1);
socket_connect();
create_request(cl->host, cl->page);
socket_send();
socket_recv();
socket_shutdown();
cl = cl->next;
cl->_host();
}
}
void main()
{
create_object((unsigned char*)"ya.ru\0");
socket_startup();
create_address(b->t->buf1);
socket_connect();
create_request(b->t, 0);
socket_send();
socket_recv();
socket_shutdown();
get_links();
}
};
int main()
{
loader x;
x.main();
return 0;
}
|