Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Сообщения: 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;
}

-------
Ehhh.. what's up, doc?..


Последний раз редактировалось mrcnn, 04-11-2014 в 16:02.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:55, 04-11-2014 | #7