Partage
  • Partager sur Facebook
  • Partager sur Twitter

WinSock - Récupérer TOUTE une page web

Sujet résolu
Anonyme
    23 mai 2017 à 13:19:32

    Bonjour,

    Je suis à la recherche d'une âme bienveillante qui pourrait m'aider à corriger ma fonction permettant de récupérer TOUT le contenu d'une page web.

    char* ReceiveSocketMessage( SOCKET *s ) {
    	char server_reply[ LEN_BUFFER ]; // LEN_BUFFER = 256
    	char *reply = malloc( LEN_BUFFER );
    
    	int recv_size = 0;
    	int total_size = 0;
    
    	while ( 1 ) {
    		if ( ( recv_size = recv( *s, server_reply, LEN_BUFFER, 0 ) ) == SOCKET_ERROR ) {
    			printf( "Recv failed.\n" );
    			exit( 1 );
    		}
    
    		if ( recv_size > 0 ) {
    			total_size += recv_size;
    			reply = realloc( reply, total_size );
    			strncpy( reply + total_size - recv_size, server_reply, recv_size );
    		}
    		
    		if ( recv_size <= 0 ) // Avant j'avais ( recv_size <= BUFFER_LEN ), j'économisais un tour de boucle mais je sais pas si c'était bon, de toute façon même comme ça ça bug
    			break;
    	}
    
    	reply = realloc( reply, total_size + 1 );
    	reply[ total_size ] = '\0';
    
    	return reply;
    }

    Le problème est que je reçois le début de la page mais pas forcément la fin lorsque ma page fait environ 126'000 octets.
    Une idée ?

    Merci !

    EDIT : Il faut ajouter une pause dans la boucle de lecture, histoire d'attendre les données
    Solution : 

    char* ReceiveSocketMessage( SOCKET *s ) {
    	char server_reply[ LEN_BUFFER ];
    	char *reply = malloc( LEN_BUFFER + 1 );
    	memset( reply, 0, LEN_BUFFER + 1 );
    
    	int recv_size = 0;
    	int total_size = 0;
    
    	while ( 1 ) {
    		if ( ( recv_size = recv( *s, server_reply, LEN_BUFFER, 0 ) ) == SOCKET_ERROR ) {
    			printf( "Recv failed.\n" );
    			exit( 1 );
    		}
    
    		if ( recv_size > 0 ) {
    			total_size += recv_size;
    			reply = realloc( reply, total_size + 1 );
    			strncat( reply, server_reply, recv_size);
    		}
    		
    		if ( recv_size < LEN_BUFFER )
    			break;
    
    		Sleep( 5 );
    	}
    
    	return reply;
    }




    -
    Edité par Anonyme 23 mai 2017 à 16:37:51

    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2017 à 14:41:20

      Salut,

      A ta place j'aurais utiliser strncat().

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        23 mai 2017 à 16:04:32

        Salut,

        J'ai remplacé strncpy par strncat, c'est plus judicieux tu as raison. Cependant ça ne résout pas le problème ! J'ai l'impression que la requête n'arrive pas entière à mon programme, qu'elle se perd quelque part dans winsock ... 

        EDIT : Il fallait ajouter une petite pause dans la boucle de lecture ... ça fonctionne maintenant ...

        -
        Edité par Anonyme 23 mai 2017 à 16:38:20

        • Partager sur Facebook
        • Partager sur Twitter

        WinSock - Récupérer TOUTE une page web

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown