Problème socket et saut de ligne [Résolu]

Problème socket et saut de ligne [Résolu] - Perl - Programmation

Marsh Posté le 04-11-2002 à 10:52:32    

Lorsque je recupère une page depuis le web avec le script suivant, les codes 0D,0A (cr/lf) sont enregistrés dans le fichier resultat.out. Pour les pages web, ce n'est pas genant mais pour les fichiers binaires, ça l'est un peu plus. Est-ce que quelqu'un sait comment supprimer ces 2 octets ?
 
Merci d'avance
 
Voici mon code:

Code :
  1. #!/usr/bin/perl -w
  2. use IO::Socket;
  3. $server = 'www.google.fr';
  4. $port = 80;
  5. open OUTPUT, "+>resultat.out" or die "Impossible de créer le fichier resultat.out";
  6. binmode OUTPUT;
  7. $socket = IO::Socket::INET->new(
  8. Proto => 'tcp',
  9. PeerAddr => $server,
  10. PeerPort => $port,
  11. Timeout => 10,
  12. );
  13. unless($socket) {
  14. die("Could not connect to $server:$port" );
  15. }
  16. $socket->autoflush(1);
  17. print $socket ("GET / HTTP/1.1\nHost: www.google.frnn" );
  18. $off = 1;
  19. while ($line = <$socket> ){
  20. if ($line =~ /^\s*\r\n$/){
  21. $off = 0;
  22. }unless($off){
  23. print OUTPUT $line;
  24. }
  25. }
  26. exit();


Message édité par BMenez le 04-11-2002 à 14:39:40
Reply

Marsh Posté le 04-11-2002 à 10:52:32   

Reply

Marsh Posté le 04-11-2002 à 12:26:04    

Voilà un de mes vieux scripts qui devrait marcher:

Code :
  1. # Lecture de l'en-tete de la reponse...
  2. while($reponse=<$socket> )
  3. {
  4.   last if($reponse =~ /^\r$/)
  5. }
  6. # Lecture du corps de la reponse...
  7. while($reponse=<$socket> )
  8.   last if(!($longueur = eval('0+0x'.$reponse)));
  9.   while($longueur>0)
  10.   {
  11.     $reponse = <$socket>;
  12.     if($longueur<0) { chop $reponse; chop $reponse; }
  13.     print OUTPUT $reponse;
  14.     $longueur -= length($reponse);
  15.   }
  16. }


Note que dans ce script, j'ignore complètement le contenu de l'en-tête de la réponse HTTP. Tu peux ajouter un test sur le code de la réponse par exemple (404, etc.).

Reply

Marsh Posté le 04-11-2002 à 14:39:23    

Merci pour ta réponse ;)  
Voilà comment je l'ai réduit, et ça fonctionne ! (Je ne comprends pourtant pas la différence fondamentale avec ce que j'avais fait...)
Merci encore!

Code :
  1. # Lecture de l'en-tete de la reponse...
  2. while($reponse=<$socket> )
  3. {
  4. last if($reponse =~ /^\r$/)
  5. }
  6. while($reponse=<$socket> )
  7. {
  8.    print OUTPUT $reponse;
  9. }

Reply

Marsh Posté le 05-11-2002 à 08:33:16    

BMenez a écrit a écrit :

Je ne comprends pourtant pas la différence fondamentale avec ce que j'avais fait...



 
Ben la différence cruciale se situe ici :
 
Ton code d'origine :

Code :
  1. if ($line =~ /^\s*\r\n$/){ }


 
Traduction : test si $line commencerait par "\s" (optionnellement), "\r" suivi pour finir de "\n"
 
Le code-solution :

Code :
  1. last if($reponse =~ /^\r$/)


Ici, on ne parle que du "\r", la ligne ne doit contenir QUE le "\r" pour que la condition soit vraie.
 
C'est ton "\n" qui te foutait dedans ...


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed