C   53

wget.cc

Guest on 10th August 2021 05:07:27 PM

  1. /* My dumb client -- just an illustration */
  2.  
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <iostream>            
  7. #include <stdio.h>     
  8. #include <string.h>
  9. #include <netinet/in.h>
  10. #include <unistd.h>
  11. #include <sys/types.h>
  12. #include <sys/socket.h>
  13. #include <netdb.h>
  14.  
  15. using namespace std;
  16. const int BUFSIZE=102400;
  17.  
  18. void Error(char *msg)
  19. {
  20.         perror(msg);
  21.         exit(1);
  22. }
  23.  
  24. int MakeSocket(char *host, char *port) {
  25.         int s;                 
  26.         int len;       
  27.         struct sockaddr_in sa;
  28.         struct hostent *hp;
  29.         struct servent *sp;
  30.         int portnum;   
  31.         int ret;
  32.  
  33.         hp = gethostbyname(host);
  34.         if (hp == 0)
  35.                 Error("Gethostbyname");
  36.         bcopy((char *)hp->h_addr, (char *)&sa.sin_addr, hp->h_length);
  37.         sa.sin_family = hp->h_addrtype;
  38.         sscanf(port, "%d", &portnum);
  39.         if (portnum > 0) {
  40.                 sa.sin_port = htons(portnum);
  41.         }
  42.         else {
  43.                 sp=getservbyname(port, "tcp");
  44.                 if (sp == 0) Error("GetServbyname");
  45.                 portnum = sp->s_port;
  46.                 sa.sin_port = sp->s_port;
  47.         }
  48.         s = socket(hp->h_addrtype, SOCK_STREAM, 0);
  49.         if (s == -1) Error("Socket");
  50.         ret = connect(s, (struct sockaddr *)&sa, sizeof(sa));
  51.         if (ret == -1) Error("Connect");
  52.         cout << "Connect to host " << host  << " port " << port << endl;
  53.         return s;
  54. }
  55.  
  56. main(int argc, char *argv[]) {
  57.         int s;                  // socket to the web server
  58.         char meta[10000];       // contents of the metadata from the http download
  59.         char host[100];         // the hostname supplied on the command line
  60.         char url[300];          // The url built from the hostname
  61.  
  62.         if (argc != 3 || strncmp(argv[1], "http://", 7) != 0) {
  63.                 cerr << "YOu should supply a url and an output filename\n";
  64.                 exit(1);
  65.         }
  66.  
  67.         //  null terminate the hostname
  68.         strcpy(host, argv[1]+7);
  69.         *index(host, '/') = 0;
  70.         cout << "hostname = \"" << host << "\"\n";
  71.  
  72.         // Connect to the host
  73.         s = MakeSocket(host, "80");
  74.  
  75.         // write the request
  76.         strcpy(url, "GET ");
  77.         strcat(url, argv[1]);
  78.         strcpy(host, url+11);
  79.         write(s,url, strlen(url));
  80.         write(s, " HTTP/1.0\n\n", 11);
  81.  
  82.         // get the data
  83.         char data[1000000];
  84.         char *pos = data;
  85.         int len = 0;
  86.         do {
  87.                 len = read(s, pos, 100000);
  88.                 pos += len;
  89.         } while (len > 0);
  90.  
  91.         // Get the length of the metadata (everything before the first blank line)
  92.         int metalen = strstr(data, "\r\n\r\n")-data+4;// include the \r\n\r\n
  93.  
  94.         // copy the metadata into the array.  Print it
  95.         strncpy(meta, data, metalen);
  96.         meta[metalen] = 0;
  97.         cout << meta << endl;
  98.  
  99.         // Save the file data into the output file
  100.         int filefd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC,  0666);
  101.         write(filefd, data+metalen, pos-data-metalen);
  102.         close(filefd);
  103.        
  104. }

Raw Paste


Login or Register to edit or fork this paste. It's free.