IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Fichier binaire, string et sockets


Sujet :

Langage PHP

  1. #1
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut Fichier binaire, string et sockets
    Bonjour,

    Je galère un peu pour télécharger un fichier binaire via une socket.

    Premier problème: comment détecter la fin de fichier ? Tous les exemples de la FAQ donnent un code qui ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (!feof($fichierouvert)) {
        $contenu .= fread($fichierouvert, 8192);
    }
    sauf que pour un fichier binaire, il peut y avoir le code de fin de fichier avant la fin de fichier, et je sors donc de la boucle avant. J'ai essayé de tester la valeur de retour de fread, mais ça ne marche pas non plus (ça tourne en rond) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (true) {
       $buf = fread($idSocket, 1024);
       if (false === $buf) break;
       $contenu .= $buf;
    }
    Second problème: Comment tester la longueur de ma chaîne binaire ? supposons que j'ai lu 1024 octets. strlen donne la longueur jusqu'au premier '\0', pourtant je sais que ma chaîne est remplie après, puisque je peux lire la valeur $contenu[1023] . Par contre, si je lis $contenu[1024] j'ai une erreur (ce qui veut dire que la vraie longueur est bien mémorisée quelque part).

    Pour comprendre mon problème, il faut bien voir que je télécharge depuis une socket, donc il se peut que je lise moins que 1024 octets (parce que le buffer n'est pas encore rempli), mais ça ne signifie pas que le fichier soit fini.

    PS: évitez les réponses du type "transforme ta chaîne en ASCII", c'est déjà ce que je fais actuellement, mais je voudrais éviter ça.

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par 10_GOTO_10 Voir le message
    sauf que pour un fichier binaire, il peut y avoir le code de fin de fichier avant la fin de fichier
    Il n'y a pas de « code de fin de fichier ». C'est la fin du fichier, c'est tout. Aucun risque de le croiser par hasard.

    Les exemples 2 et 3 de cette page sont pour toi:
    http://php.net/manual/en/function.fread.php

    Cela dit, pour un socket, tu ferais mieux d'utiliser socket_recv.

    Pour la longueur de la chaine, tu peux la calculer facilement en additionnant le nombre de bytes reçus (avec socket_recv).

    Mais comme tu le dis, la vraie longueur est mémorisée quelque part. Dans PHP même en fait.
    D'ailleurs, sur mon PHP 5.3, ceci fonctionne très bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $str = "hello\0haha\0hoho";
    $str .= "\0\0\0hehehe";
    // Soit un total de 24 caractères
    echo strlen($str);
    // Et ça affiche bien 24

  3. #3
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Si t'envoies du binaire je crois que t'as pas d'autre choix que de passer la taille ou de "prévenir quand t'as fini". sinon les pgm des sockets c'est sur le forum du C que tu les trouveras ^^
    Pour ton prob de EOF sous php t'as essayé de tout lire d'un coup ?

  4. #4
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    Ok pour le strlen, quand j'ai testé, j'ai dû tomber par malchance sur un paquet incomplet (ah, la loi de Murphy).

    Pour le fread, je l'utilisait pour être homogène avec l'ouverture de connexion fsockopen:

    Return Values
    fsockopen() returns a file pointer which may be used together with the other file functions (such as fgets(), fgetss(), fwrite(), fclose(), and feof()).
    Je vais essayer avec les fonctions socket_create, sockek_recv , elles ont l'air mieux adaptées, effectivement.

  5. #5
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    Bon, et bien je confirme que ni feof, ni fread, ni filesize (exemple 2) ne marchent avec un handle de socket: fread ne renvoie jamais false, filesize fait une erreur "stat failed for Resource", et feof fait des trucs bizarres que j'ai pas compris. Et tout lire d'un coup ne marche pas non plus (je n'ai que les 8000 premiers octets environ).

    Par contre stream_get_contents semble fonctionner (exemple3), à condition de connaître la taille (que je passe donc dans un premier temps).

    Merci à vous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 01/09/2006, 14h19
  2. Nettoyer String □ (recup d'1 fichier binaire)
    Par gabule dans le forum Langage
    Réponses: 4
    Dernier message: 31/05/2006, 15h09
  3. Fichier binaire en C++ et string
    Par merrheim dans le forum C++
    Réponses: 9
    Dernier message: 23/02/2006, 22h30
  4. [VB6]écriture dans un fichier: mélange binaire string.
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 28/12/2005, 12h29
  5. Réponses: 2
    Dernier message: 06/12/2005, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo