home *** CD-ROM | disk | FTP | other *** search
/ ftp.disi.unige.it / 2015-02-11.ftp.disi.unige.it.tar / ftp.disi.unige.it / pub / .person / GianuzziV / SO1 / echo_client_web.c < prev    next >
C/C++ Source or Header  |  2005-04-05  |  5KB  |  176 lines

  1. /* echo_client_web.c
  2.    si collega con il server WEB sulla macchina "host"
  3.    In questa versione   simula il comportamento di un browser
  4.    che si connette con la pagina index.html del WEB server indicato.
  5.    L'host client e' fisso e si chiama "arsenio".
  6.    Lavorando dalla macchina "pinco", sostituire "arsenio" con "pinco" nella 
  7.    stringa dove si identifica il chiamante.
  8.    L'output e' la pagina index.html del WEB server della macchina "host".
  9.    Ovviamente, deve esistere un WEB server su "host"  (ad esempio usare arsenio).
  10. */
  11.  
  12. #include <stdio.h>
  13. #include <sys/types.h>
  14. #include <sys/socket.h>
  15. #include <netinet/in.h>
  16. #include <netdb.h>
  17. #define SERVER 80    // well known WEB server port
  18.  
  19. main (argc, argv)
  20. int  argc;
  21. char **argv;
  22.  
  23. { int  sockfd;                  /* socket descr. */
  24.   int  len;                     /* n.ro byte dati ricevuti */
  25.   struct  sockaddr_in  sa;      /* indirizzo Internet */
  26.   struct  hostent  *hp;         /* risultato host name lookup */
  27.   struct  servent  *sp;         /* risultato service lookup */
  28.   char  buf[BUFSIZ];            /* informazioni da whois */
  29.   char  *myname;                /* nome di questo eseguibile */
  30.   char  *host;                  /* nome dell'host remoto */
  31.   char  stringa[2000];          /* stringa da scambiare con server WEB */
  32.   char  *result;
  33.  
  34.   myname=argv[0];
  35.   if (argc != 2) {
  36.      printf("Usage: %s  host  \n", myname);
  37.      exit(1);
  38.      }
  39.   host=argv[1];
  40.  
  41.   if (( hp=gethostbyname(host) )==NULL)  {
  42.      printf("%s:  %s:  no such host \n", myname, host);
  43.      exit(1);
  44.     }
  45.  
  46.   /* costruisce la struttura che contiene l'indirizzo dell'host
  47.      da contattare, e il tipo di indirizzamento usato */
  48.  
  49.   bcopy((char *) hp->h_addr, (char *) &sa.sin_addr, hp->h_length);
  50.   sa.sin_family=hp->h_addrtype;
  51.  
  52.   /* inserisce il socket number dentro la struttura del socket */ 
  53.  
  54.   sa.sin_port=htons((short int) SERVER);
  55.  
  56.   /* richiede un descrittore di socket */
  57.  
  58.   if (( sockfd=socket(hp->h_addrtype, SOCK_STREAM, 0))<0 )   {
  59.       printf("%s:  errore apertura socket \n", myname);
  60.       exit(1);
  61.   }
  62.  
  63.   /* mi connetto con il server remoto */
  64.  
  65.   if (connect(sockfd, (struct sockaddr *) &sa, sizeof sa)<0)
  66.    {
  67.      printf ("%s:  connessione rifiutata \n", myname);
  68.      exit(1);
  69.    }
  70.  
  71. sprintf(stringa, "GET / HTTP/1.0");
  72. len=strlen(stringa);
  73. stringa[len]=13;    // CR
  74. stringa[len+1]=10;    // LF
  75. stringa[len+2]='\0';
  76.   if (write(sockfd, stringa, strlen(stringa)) != strlen(stringa))
  77.    {
  78.      printf("%s:  write error \n", myname);
  79.      exit(1);
  80.    }
  81.  
  82. sprintf(stringa, "Connection: Keep-Alive");
  83. len=strlen(stringa);
  84. stringa[len]=13;
  85. stringa[len+1]=10;
  86. stringa[len+2]='\0';
  87.   if (write(sockfd, stringa, strlen(stringa)) != strlen(stringa))
  88.    {
  89.      printf("%s:  write error \n", myname);
  90.      exit(1);
  91.    }
  92.  
  93. sprintf(stringa, "User-Agent: Mozilla/4.78 [en] (X11; U; Linux 2.4.2 i686)");
  94. len=strlen(stringa);
  95. stringa[len]=13;
  96. stringa[len+1]=10;
  97. stringa[len+2]='\0';
  98.   if (write(sockfd, stringa, strlen(stringa)) != strlen(stringa))
  99.    {
  100.      printf("%s:  write error \n", myname);
  101.      exit(1);
  102.    }
  103.  
  104. sprintf(stringa, "Host: arsenio.disi.unige.it");
  105. len=strlen(stringa);
  106. stringa[len]=13;
  107. stringa[len+1]=10;
  108. stringa[len+2]='\0';
  109.   if (write(sockfd, stringa, strlen(stringa)) != strlen(stringa))
  110.    {
  111.      printf("%s:  write error \n", myname);
  112.      exit(1);
  113.    }
  114.  
  115. sprintf(stringa, "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*");
  116. len=strlen(stringa);
  117. stringa[len]=13;
  118. stringa[len+1]=10;
  119. stringa[len+2]='\0';
  120.   if (write(sockfd, stringa, strlen(stringa)) != strlen(stringa))
  121.    {
  122.      printf("%s:  write error \n", myname);
  123.      exit(1);
  124.    }
  125.  
  126. sprintf(stringa, "Accept-Encoding: gzip ");
  127. len=strlen(stringa);
  128. stringa[len]=13;
  129. stringa[len+1]=10;
  130. stringa[len+2]='\0';
  131.   if (write(sockfd, stringa, strlen(stringa)) != strlen(stringa))
  132.    {
  133.      printf("%s:  write error \n", myname);
  134.      exit(1);
  135.    }
  136.  
  137. sprintf(stringa, "Accept-Language: en ");
  138. len=strlen(stringa);
  139. stringa[len]=13;
  140. stringa[len+1]=10;
  141. stringa[len+2]='\0';
  142.   if (write(sockfd, stringa, strlen(stringa)) != strlen(stringa))
  143.    {
  144.      printf("%s:  write error \n", myname);
  145.      exit(1);
  146.    }
  147.  
  148. sprintf(stringa, "Accept-Charset: iso-8859-1,*,utf-8 ");
  149. len=strlen(stringa);
  150. stringa[len]=13;
  151. stringa[len+1]=10;
  152. stringa[len+2]='\0';
  153.   if (write(sockfd, stringa, strlen(stringa)) != strlen(stringa))
  154.    {
  155.      printf("%s:  write error \n", myname);
  156.      exit(1);
  157.    }
  158.  
  159. stringa[0]=13;
  160. stringa[1]=10;
  161. stringa[2]='\0';
  162.   if (write(sockfd, stringa, strlen(stringa)) != strlen(stringa))
  163.    {
  164.      printf("%s:  write error \n", myname);
  165.      exit(1);
  166.    }
  167.  
  168.   /* ricevo la replica */
  169.  
  170.   while ((len=read(sockfd, buf, BUFSIZ))>0)
  171.          write(0, buf, len);
  172.   close(sockfd);
  173.   exit(0);
  174. }
  175.  
  176.