freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

Διάβασμα απο το αρχείο dedomena.html


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [6 Μηνύματα]      Bookmarks Tags: htmlδιάβασμααρχείο Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
master3763


Μέλος από: 12 Δεκ 2008
Μηνύματα: 65

View users profile Visit posters website
ΜήνυμαΣτις: 29 Αυγ 2009 19:52    Θέμα: Διάβασμα απο το αρχείο dedomena.html
Περιγραφή θέματος: Διάβασμα απο το αρχείο dedomena.html
Απάντηση με παράθεση  Mark this post and the followings unread

Γεια σε όλους ! θα ήθελα να ρωτήσω , πως μπορώ να διαβάσω δεδομένα αλλά και να τα εμφανίσω στο πρόγραμμα μου, από μία ιστοσελίδα ;
Μάλλον θα υπάρχει κάποιο script στη C++ που να το κάνει αυτό.

www.freewebs.com/mypage/dedomaena.html

Με λίγα λόγια θέλω να διαβάσω δεδομένα από την το αρχείο dedomena.html που βρίσκετε σε κάποιον απομακρυσμένο server (freewebs.com) .
Το διάβασμα από ένα αρχείο txt μου είναι γνωστό .
Πώς όμως θα διαβάσω τα δεδομένα που βρίσκονται σε αρχείο .html σε ένα server ;
soteres2002
S. & H. Moderator

Μέλος από: 05 Μαρ 2004
Βοηθήματα: 1
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Ιωάννινα
View users profile
ΜήνυμαΣτις: 29 Αυγ 2009 22:04    Θέμα: Re: Διάβασμα απο το αρχείο dedomena.html
Περιγραφή θέματος: Διάβασμα απο το αρχείο dedomena.html
Απάντηση με παράθεση  Mark this post and the followings unread

Αυτό που ζητάς αφορά το πως θα επικοινωνήσεις με έναν απομακρυσμένο διακομιστή ΗΤΤΡ για να πάρεις ένα έγγραφο. Αυτό γίνεται με 2 διαφορετικούς τρόπους (αλλά ουσιαστικά είναι το ίδιο):
α) χρησιμοποιείς BSD sockets σε Linux/Unix ή Winsock σε Windows link to Windows, κάνεις connect() στην ΙΡ του σερβερ και στέλνεις μια αίτηση GET για να πάρεις το έγγραφο. Η ανάγνωση γίνεται με κλήσεις συστήματος read()/write().
β) χρησιμοποιείς κάποιο abstraction layer πχ την βιβλιοθήκη w3c-www ή LWP ( http://www.w3c.org )

Για τη δεύτερη λύση, μπες στο w3c.org και κατέβασε την σχετική βιβλιοθήκη που περιλαμβάνει και παραδείγματα για το πως να την χρησιμοποιήσεις.
Όσον αφορά την πρώτη λύση, δες ένα δικό μου παράδειγμα κώδικα που κάνει αυτό που ζητάς... (Βέβαια, κάνει κάτι παραπάνω από αυτό που ζητάς, χρησιμοποιεί νήματα για να κάνει ταυτόχρονες αιτήσεις για το ίδιο έγγραφο, αλλά never mind!)


κώδικας:

//// client.c ////
/**
 * Sotiris Karavarsamis. (C) All rights reserved. 2008.
 */

#ifndef _REENTRANT
  #define _REENTRANT
#endif

#include <stdio.h>
#include <errno.h>

/* Headerfiles for Unix/Linux */
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <pthread.h>
#include <getopt.h>
#include <unistd.h>
#include <fcntl.h>

#define closesocket(s) close(s)

#ifndef MAXHOSTNAMELEN
  #define MAXHOSTNAMELEN 128
#endif

/* http used to be requested on port 80 */
#define HTTPD_PORT 4001

struct sockaddr_in server;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
long int throughput = 0;
int port = HTTPD_PORT;
int concurrency = 5;
int joined = 0;
int outfile = -2;
char *resource = "";
char *hostname = "";

void usage(char *bin) {
    fprintf(stderr, "Usage: %s [-p portnum] [-h] \n",bin);
    fprintf(stderr, "-p portnumber : alternate port number.\n");
    fprintf(stderr, "-t target hostname to lookup\n");
    fprintf(stderr, "-c concurrency: set concurrency level (default 5)\n");
    fprintf(stderr, "-r resource: string which represents the resource to requestn\n");
    fprintf(stderr, "-o output: write received input to a file instead of stdout\n");
    fprintf(stderr, "-s HTTP hostname field value: default is empty\n");
    fprintf(stderr, "-h : print usage.\n");
    exit(1);
}

void *retrieve(void *arg) {
    int fd;
    int count = 0;
    char buffer[4096];
   
    fd = (int *)arg;
    pthread_mutex_lock(&lock);
    if(connect(fd, (struct sockaddr*)&server, sizeof(server)) < 0) {
   pthread_mutex_unlock(&lock);
        perror( "can't connect to server");
        return(NULL);
    }
    pthread_mutex_unlock(&lock);

    /* create and send the http GET request */
    sprintf(buffer, "GET /%s HTTP/1.0\r\nHost: %s\r\nAccept-Encoding:\r\n\r\n", resource, hostname);
    send(fd, buffer, strlen( buffer), 0);

    /* get the answer from server and put it out to stdout */
    do {
       count = recv(fd, buffer, sizeof(buffer), 0);
       
       if(outfile != -2)
        write(outfile, buffer, count);
       else
         write(1, buffer, count);
       
       pthread_mutex_lock(&lock);
        throughput += count;
       pthread_mutex_unlock(&lock);
    } while (count > 0);
   
    /* close the connection to the server */
    closesocket(fd);
    pthread_exit("thread terminated");
}

void ext(int sig) {
        printf("\n");
   if(joined < concurrency) {
      printf("Punt! Not all threads (%d) have joined yet...\n", joined);
   }
   
   printf("%lu bytes have been transfered.\n", throughput);
   exit(EXIT_SUCCESS);
}

int main( int argc, char **argv)
{
    struct hostent *host_info;
    unsigned long addr;
    int *sock;
    int c, i, ret;
    pthread_t *tid;
    char *target = NULL;
   
    while((c = getopt(argc,argv,"c:t:p:hr:o:s:")) != -1) {
        switch(c) {
     case 'c':
       concurrency = atoi(optarg);
       break;
          case 'p':
            port = atoi(optarg);
            break;
          case 't':
       target = strdup((char *)optarg);
            break;
          case 'h':
            usage(argv[0]);
       exit(0);
            break;
          case 'r':
            resource = strdup((char *)optarg);
            break;
          case 'o':
            outfile = open((char *)optarg, O_RDWR | O_CREAT | O_TRUNC, 0655);
            if(outfile == -1) {
              perror("open");
              exit(1);
            }
          case 's':
            hostname = strdup((char *)optarg);
            break;
        }
    }

    signal(SIGINT, ext);
   
    if(!target || concurrency <= 0) {
   usage(argv[0]);
        exit(EXIT_FAILURE);
    }

    sock = (int *)malloc(concurrency*sizeof(int));
    if(sock == NULL) {
      perror("malloc()");
    }
   
    tid = (pthread_t *)malloc(concurrency * sizeof(pthread_t));
    if(tid == NULL) {
      perror("malloc()");
    }

    fprintf(stdout, "[*] turing concurrency to %d\n", concurrency);

    /* create socket */
    for(i = 0; i < concurrency; i++) {
       sock[i] = socket(AF_INET, SOCK_STREAM, 0);
       if (sock[i] < 0) {
           perror("socket()");   
           exit(1);
           }
    }
   
    memset( &server, 0, sizeof (server));
    host_info = gethostbyname(target);
    if (NULL == host_info) {
        fprintf( stderr, "could not resolve host '%s'!\n", target);
        exit(1);
    }

    memcpy( (char *)&server.sin_addr, host_info->h_addr, host_info->h_length);
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
   
    for(i = 0; i < concurrency; i++) {
      ret = pthread_create(&tid[i], NULL, retrieve, (void *)sock[i]);
      if(ret != 0) {
          fprintf(stderr, "Could not spawn thread %d\n", i + 1);
          exit(EXIT_FAILURE);
      }
    }
   
    for(i = 0; i < concurrency; i++) {
       ret = pthread_join(tid[i], NULL);
       if(ret != 0) {
          perror("pthread_join()");
       }
       joined++;
    }
 
    if(concurrency == joined) {
      printf("All threads have terminated normally!\n");
    }
    printf("Totally transfered %ld bytes from %d concurrent connections...\n", throughput, concurrency);

    if(sock)
      free(sock);
   
    if(tid)
      free(tid);
   
    if(outfile != -2)
      close(outfile);

    exit(EXIT_SUCCESS);
}


Μελέτησε τον κώδικα, και ό,τι απορίες έχεις εδώ είμαστε! Επίσης, για ευκολία σου προτείνω να μην δώσεις σημασία στις συναρτήσεις pthread_*: δώσε κυρίως βάση στην συνάρτηση retrieve() που κάνει την μεταφορά του εγγράφου.

Αυτό που πρέπει να κατανοήσεις για τα sockets είναι η ακολουθία hostname resolution -> socket() -> connect() -> read/write() .

Ο κώδικας αυτός δουλεύει μόνο σε Unix (αλλά φαντάζομαι με Ming/GW κάνεις άνετα εκτελέσιμο για windows), και μπορείς να το κάνεις compile με την εντολή:
κώδικας:

gcc client.c -o client -lpthread


Δυστυχώς, δεν έχω κάτι πιο απλό να σου δείξω... είχα στο blog μου έναν πιο απλό κώδικα που έκανε GET ΗΤΤΡ μεταφορά, αλλά είναι down και δεν έχω κάποιο local copy να σου στείλω... Φυσικά κάνοντας λίγο Googling μπορείς να βρεις κάποιο παράδειγμα που να κάνει ακριβώς αυτό που ζητάς, έψαξα λίγο μήπως βρω κάποια σελίδα αλλά μπα..

Σου δίνω και ένα λινκ από το δυνατό μάθημα "Προγραμματισμός Δικτύων" από το τμήμα Πληροφορικής του Πανεπιστημίου Ιωαννίνων που περιέχει πληροφορίες για clients, servers, πρωτόκολλα επικοινωνίας κτλ που όλα γενικά είναι σχετικά με αυτά που ρωτάς, αν θες να ψάξεις το κατιτίς παραπάνω στο θέμα αυτό...
URL: http://www.cs.uoi.gr/~ntarmos/Courses/NetworkProgramming/
master3763


Μέλος από: 12 Δεκ 2008
Μηνύματα: 65

View users profile Visit posters website
ΜήνυμαΣτις: 30 Αυγ 2009 16:21    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Τόσο σύνθετο είναι το ζήτημα δηλαδή ?
Μήπως υπάρχει τίποτα έτυμο ρε παιδιά ? Η τίποτα απλό ?
Θα προσπαθήσω να το τρέξω τον κώδικα αλλά μάλλον θα χρειαστώ πολύ χρόνο.........

_________________
http://texnologos.orgfree.com
soteres2002
S. & H. Moderator

Μέλος από: 05 Μαρ 2004
Βοηθήματα: 1
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Ιωάννινα
View users profile
ΜήνυμαΣτις: 31 Αυγ 2009 00:49    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

master3763 ανέφερε:
Τόσο σύνθετο είναι το ζήτημα δηλαδή ?
Μήπως υπάρχει τίποτα έτυμο ρε παιδιά ? Η τίποτα απλό ?


Από τι στιγμή που πρέπει να διαβάσεις δεδομένα από το δίκτυο (κάτι που δεν έχει σχέση με είσοδο/έξοδο σε αρχεία στο δίσκο), πρέπει να χρησιμοποιήσεις υποδοχές (sockets). Απο κει και πέρα, μπορείς να χρησιμοποιήσεις βιβλιοθήκες που αφαιρούν όλη την πολυπλοκότητα του προβλήματος και εσύ απλά κάνεις μερικές κλήσεις συναρτήσεων της βιβλιοθήκης... Δυστυχώς είναι μονόδρομος και δεν υπάρχει άλλος τρόπος...
master3763


Μέλος από: 12 Δεκ 2008
Μηνύματα: 65

View users profile Visit posters website
ΜήνυμαΣτις: 14 Ιουλ 2010 20:35    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Αυτο ειναι ενα προγραμμα για Linux . Αυπαρχει τυποτα για windows link to windows ?

_________________
http://texnologos.orgfree.com
dva_dev
Script Master

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 14 Ιουλ 2010 21:46    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Κάνε μια αναζήτηση για InternetOpenUrl ή InternetReadFile και θα βρείς πολύ πράμα. Υπάρχουν αρκετά ολοκληρωμένα παραδείγματα στο codeproject.com και το codeguru.com
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [6 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Τώρα είναι 09 Δεκ 2016 02:02 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos