Socket perl et Freebox... ;))

Fermé
2Spartiate - 25 juin 2004 à 12:36
 2Spartiate - 25 juin 2004 à 12:39
EUREKA !

Mes amis, aujourd'hui est un grand jour.
J'ai résolu le problème pour lequel j'ai tant secoué le net ses dernière s semaines...
Je post ici la solution, pour la postérité, au cas où y'en ai d'autres dans mon cas, par la suite...


Le flux TCP doit être ralentit lorsque la Freebox (ou une carte Ethernet) est branchée par USB.
Ce qui fait qu'une requete TCP trop rapide peut provoquer un bug, et donc empêcher la création d'un socket.

En Perl, le problème se situait au niveau de la fonction send() (du moins, c'est ce que j'en ai déduit).
Car elle doit envoyer la requête de manière trop "directe".
Je m'explique:
Il s'agit de créer une socket , PUIS d'envoyer la requête.

Ainsi, après quelque recherches, durant une bonne partie de la nuit (c'est pô grave, yavé le pot de Nutella ;)

J'ai codé ce petit prog, échapant à la fonction send()
(malgré parfois 2-3 bugs au niveau du package INET.pm, ca fonctionne):



début du code ----------------------->


###################################################################################################################
#
#!/usr/bin/perl -w
#
# Petit prog socket pour pauvres freeboxiens ;)))
#
# Il permet de créer des sockets, sans passer par la fonction send ()
# Nous utiliserons ici le protocole HTTP, avec une fonction #ask_server(), pour pas se prendre la tete !...
#
# Bien evidemment, se problème va nous obliger à fabriquer nos #propres headers TCP/IP, mais bon...
#
#A noter aussi que ce n'est qu'une approche des sockets Perl;
#Le problème persiste peut-être, par exemple, lorsqu'on veur créer #ses propres paquets IP... (et oui, c'est possible,avec Perl ;)
#
###################################################################################################################


use IO::Socket;



###########################
# paramettres #
###########################


$server = "www.google.fr"; # L'URL du serveur
$port = "80"; # Le port du serveur distant
$methode = "POST"; # La méthode de requette HTTP ("GET", ou "POST")
$page = "/search"; # La page demandee, commencent imperativement par "/"
$type_connection = "close"; # Le type de connection ("close", ou "Keep-Alive")

$content="hl=fr&ie=UTF-8&as_qdr=all&q=sockets&btnG=Recherche&meta="; # Le contenu, s'il y a lieu




###########################
# Traitement des donnees #
###########################





if ($methode eq "GET") #si la methode est "GET" ...

{

$requete ="GET ".$page."?".$content." HTTP/1.1
Host: ".$server."
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020615
Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: fr,fr-fr;q=0.7,en;q=0.3
Connection: ".$type_connection."\n\r\n\r";

}

if ($methode eq "POST") #si la methode est "POST" ...

{

$requete ="POST ".$page." HTTP/1.1
Host: ".$server."
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020615
Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: fr,fr-fr;q=0.7,en;q=0.3
Connection: ".$type_connection."
Content-Type: application/x-www-form-urlencoded
Content-length: ".$content_length."\r\n\r\n".$content."\n\n";
}

$server = $server.":".$port; #la feinte qui tue tout, lol
$content_length=length($content); # le poids du content


###########################
# Fonction ask_server() #
###########################


sub ask_server
{
my $server = $_[0];
my $requete = $_[1];



$remote = IO::Socket::INET->new($server) # creation du socket

|| die "Impossible de se connecter a $server, sur le port $port: $!";

print $remote "$requete"; #envois de la requete
print while <$remote> #renvois la réponse du serveur

}



###########################
# FreeBox en USB ?! ;)) #
###########################



ask_server ($server,$requete); #envois de la requete



<------------------------------ fin du code

Et voilou !
Le problème est règlé !

Pfiouuu !....


<=2Spartiate=>Une ptite socket entre amis ? ;))

1 réponse

P.S:

Pour l'exemple, essayer plutot avec la méthode GET, lol...
0