Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [c- socket] creare una connessione HTTP

    ciao

    sto facendo un porgrammino in ambiente unix che apre una connessione http su un server tramite una socket, fa una richiesta GET e aspetta la risposta, il mio problema è che non so quanti dati aspettare!!!

    cioè io non posso sapere a priori quanti dati mi invierà il server, quindi cosa devo fare per restare in ascolto fino a quando il server "non ha finito" di rispondermi?

    questo è il codice che uso io ora:

    codice:
      struct sockaddr_in  server;
      int                 sockfd;
    
        sockfd = socket (PF_INET, SOCK_STREAM, 0);
        if (sockfd < 0)
          {
    	perror ("socket");
    	exit(1);
          }
    
        bzero ((char*)&server, sizeof(struct sockaddr_in));
        
        server.sin_family = AF_INET;
        server.sin_port = htons(80);
        
        if(inet_aton("127.0.0.1",&(server.sin_addr))==0){
          perror("impostazione indirizzo..");
          exit(1);
        }
        
        if (connect(sockfd, (struct sockaddr *)&server, sizeof(server))) {
          perror("error connecting..");
          exit(1);
        }
        char[] mieidati="GET /";
    
         if(send(sockfd,mieidati,strlen(mieidati)*sizeof(char),0)<0){
           perror("error sending..");
           exit(1);     
         }
    
    /*
    .... come faccio la recv?
    */
           if(close(sockfd)<0){
           perror("error closing..");
           exit(1);
         }
    grazie
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Beh ... attendi in un loop ...

  3. #3
    ok, ma quando finisco di leggere?

    quando la recv mi da -1 ?

    grazie
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Finisci di leggere in diversi casi ...

    1) ricevi un errore da socket (connessione chiusa, errore in ricezione ...)

    2) hai ottenuto tutti i caratteri che ti aspettavi (se conosci il tipo di risposta)

    3) in base ad un evento esterno (pressione di un tasto, un click sul mouse ...)

  5. #5
    dunque, visto che è una connessione http, io devo finire di leggere i dati quando il server ha finito di inviarmeli...

    vi allego sotto il codice che uso e l'output del prohgramma...

    la cosa strana è che in questo esempio io faccio 2 richieste al server, la prima funziona bene, e poi la mia recv resta tipo 10 secondi ad aspettare che il server mandi la fine della risposta, la seconda volta invece io non leggo proprio nulla!!!

    codice:
    void riesegui_richieste(tester *current_tester){
      
      struct sockaddr_in  server;
      int                 sockfd;
      
      db_pacchetti *db=current_tester->db;
      
      int i=0;
      sockfd = socket (PF_INET, SOCK_STREAM, 0);
      if (sockfd < 0)
          {
    	perror ("socket");
    	exit(1);
          }
      
        
      bzero ((char*)&server, sizeof(struct sockaddr_in));
      
      server.sin_family = AF_INET;
      server.sin_port = htons(db->port);
      
      if(inet_aton(db->host,&(server.sin_addr))==0){
        perror("impostazione indirizzo..");
          exit(1);
      }
      
      if (connect(sockfd, (struct sockaddr *)&server, sizeof(server))) {
        perror("error connecting..");
        exit(1);
        }
      
      for(i=0;i<db->current;i++){
        
        printf("sono il tester %i e inizio l'immissione del pacchetto %i\n",current_tester->tester_id,i);
        
        
        
        if(i>0){
          //dormo per riproduzione dei pacchetti fedele alla registrazione
          printf("sono il tester %i al pacchetto %i e dormo per %i secondi \n",current_tester->tester_id,i,(db->db[i].timestamp)-(db->db[i-1].timestamp));
          sleep((db->db[i].timestamp)-(db->db[i-1].timestamp));
          printf("sono il tester %i al pacchetto %i e mi sveglio \n",current_tester->tester_id,i);      
        }
        //    printf("sendo a %s:%i: \n%s\n",db->host,db->port,db->db[i].payload);
        
        printf("sono il tester %i e inizio l'invio del pacchetto %i \n",current_tester->tester_id,i);
        if(send(sockfd,db->db[i].payload,db->db[i].size,0)<0){
          perror("error sending..");
          exit(1);     
        }
        printf("sono il tester %i e ho finito l'invio del pacchetto %i \n",current_tester->tester_id,i);
        
        
        //ora ascolto la risposta del server
        int size_buff=255;
        char buff[size_buff];
        
        int check=1;
        
        printf("sono il tester %i e ascolto la risposta del server per il pacchetto %i \n",current_tester->tester_id,i);
        
        while(check>0){
          //recv(sockfd,buff,sizeof(char)*size_buff,0)==size_buff*sizeof(char)
          printf("sono il tester %i e provo a ricevere %i dati per il pacchetto %i \n",current_tester->tester_id,sizeof(char)*size_buff,i);
          check=recv(sockfd,buff,sizeof(char)*size_buff,0);
          printf("sono il tester %i e ho ricevuto %i dati invece di %i per il pacchetto %i \n",current_tester->tester_id,check,sizeof(char)*size_buff,i);
          buff[check]='\0';
          printf("%s",buff);
        }
        
        printf("sono il tester %i e ho finito di ascoltare la risposta del server per il pacchetto %i \n",current_tester->tester_id,i);
        
        
        
        //incremento il contatore generale di 1 perchè ho elaborato un pacchetto
        *(db->counter_shared)+=1;
        printf("sono il tester %i e ho elaborato il pacchetto %i\n",current_tester->tester_id,i);
        }   
      
      printf("sono il tester %i e chiudo la connessione\n",current_tester->tester_id); 
      
        if(close(sockfd)<0){
          perror("error closing..");
          exit(1);
        }
        printf("sono il tester %i e ho finito\n",current_tester->tester_id); 
    }
    e questo è l'output che ottengo:

    sono 0 e parto
    sono il tester 0 e inizio l'immissione del pacchetto 0
    sono il tester 0 e inizio l'invio del pacchetto 0
    sono il tester 0 e ho finito l'invio del pacchetto 0
    sono il tester 0 e ascolto la risposta del server per il pacchetto 0
    sono il tester 0 e provo a ricevere 255 dati per il pacchetto 0
    sono il tester 0 e ho ricevuto 255 dati invece di 255 per il pacchetto 0
    HTTP/1.1 200 OK
    Date: Sun, 09 Apr 2006 08:52:30 GMT
    Server: Apache
    X-Powered-By: PHP/4.3.11
    Content-Length: 1337
    Keep-Alive: timeout=15, max=100
    Connection: Keep-Alive
    Content-Type: text/html
    <html>
    .... .... ..
    sono il tester 0 e provo a ricevere 255 dati per il pacchetto 0
    sono il tester 0 e ho ricevuto 9 dati invece di 255 per il pacchetto 0
    </html>
    sono il tester 0 e provo a ricevere 255 dati per il pacchetto 0

    passano 10 secondi ....

    sono il tester 0 e ho ricevuto 0 dati invece di 255 per il pacchetto 0
    sono il tester 0 e ho finito di ascoltare la risposta del server per il pacchetto 0
    sono il tester 0 e ho elaborato il pacchetto 0
    sono il tester 0 e inizio l'immissione del pacchetto 1
    sono il tester 0 al pacchetto 1 e dormo per 2 secondi
    siamo al 0.500000 %
    siamo al 0.500000 %
    sono il tester 0 al pacchetto 1 e mi sveglio
    sono il tester 0 e inizio l'invio del pacchetto 1
    sono il tester 0 e ho finito l'invio del pacchetto 1
    sono il tester 0 e ascolto la risposta del server per il pacchetto 1
    sono il tester 0 e provo a ricevere 255 dati per il pacchetto 1
    sono il tester 0 e ho ricevuto 0 dati invece di 255 per il pacchetto 1
    sono il tester 0 e ho finito di ascoltare la risposta del server per il pacchetto 1
    sono il tester 0 e ho elaborato il pacchetto 1
    sono il tester 0 e chiudo la connessione
    sono il tester 0 e ho finito
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.