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

Web Perl Discussion :

Formulez des requêtes udp en hexadécimal.


Sujet :

Web Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 7
    Par défaut Formulez des requêtes udp en hexadécimal.
    Voila j'aimerais créer un petit bot pour un serveur counter-strike.

    Je me suis renseigné sur les protocoles , et par exemple pour faire une requête PING du serveur il fait envoyer ce message :
    [FF][FF][FF][FF]ping

    ( * 4 octets de valeur 255 ou encore FF.
    * Le nom de la requête en minuscules et en ASCII. )

    Voici mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    use IO::Socket::INET;
     
     
    $sock = IO::Socket::INET->new(PeerAddr => '213.251.145.246',
                                    PeerPort => '27017',
                                    Proto    => 'udp') or die "Impossible de se connecter\n";
     
    print $sock "0xff\0xff\0xff\0xffping";
    $input = unpack("C6",$sock); 
    print "$input\n";
    print "$sock\n";
    Et voici la valeur retournée à chaque fois :
    73
    IO::Socket::INET=GLOB(0x19672bc)

    Le serveur doit répondre en principe ce message :
    FF FF FF FF 6A 00 255 255 255 255 106 000 ÿÿÿÿj.

    Il y a donc un problème vu que lorsque je met la commande "details" a la place de "ping" , j'obtient la même réponse.

    Ma requête est elle mal formulée ?

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Peut-être devrais tu lire la réponse sur le socket ?
    $sock est un objet représentant le socket, il faut que tu lises la réponse dessus, avec read() par exemple.

    --
    Jedaï

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 7
    Par défaut
    Ba j'avais fait un bot auparavant en utilisant les sockets. Je lisais le socket avec une boucle du type while ( $rep = $socket ) { ... et il marche trés bien ! La quand je met une boucle while ($socket) ca m'affiche des millions de fois la réponse je ne comprend pas pourquoi :/

    Je vais aller me renseigner encore un peu sur les sockets pour savoir bien utiliser read() merci.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 7
    Par défaut
    Bon ba jviens de bouquiner mon gros bouquin PERL. Il dit que la lecture du socket peut se faire par : $reponse = <$socket>;

    Voici donc mon nouveau code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    use IO::Socket::INET;
     
     
    $sock = IO::Socket::INET->new(PeerAddr => '213.251.145.246',
                                    PeerPort => '27017',
                                    Proto    => 'udp') or die "Impossible de se connecter\n";
    while ($rep = <$sock>) {
    print $sock "0xff\0xff\0xff\0xffping";
    $input = unpack("C6",$rep); 
    print "$input\n";
    print "$rep\n";
     
    close($socket);
    }
    Et maintenant plus aucune réponse du serveur . A mon avis c'est "0xff\0xff\0xff\0xffping" qui pèche ...

    Je ne sais pas bien le formuler :/ , je vais continuer à chercher comment faire.

    Merci d'avance pour l'aide !

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par NoRKi
    Et maintenant plus aucune réponse du serveur . A mon avis c'est "0xff\0xff\0xff\0xffping" qui pèche ...

    Je ne sais pas bien le formuler :/ , je vais continuer à chercher comment faire.

    Merci d'avance pour l'aide !
    J'ai l'impression que tu as fait un copier-coller... Donc le 0xff sans "\" est sûrement une vraie erreur.

    Par ailleurs, tu commences par lire dans ton code là... Il va attendre que ton serveur lui envoie quelque chose, or tu ne lui as encore rien demandé, je crains qu'il n'attende longtemps !
    (<> devrait fonctionner pour la lecture, mais l'avantage de read() c'est que tu peux lui indiquer combien d'octets tu veux lire exactement, ce qui peut-être utile vu le faible niveau d'abstraction de ton programme)

    --
    Jedaï

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 7
    Par défaut
    Eu nan ce n'était pas un copier/coller.

    Sinon j'ai trouvé , le bon argument est :
    \xff\xff\xff\xffping

    Et la j'ai fait un bon gros C/C ^^ mais au moins ca marche !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    use IO::Socket::INET;
     
    $buffsize = 1024;
    $request =  "\xff\xff\xff\xffping";
     
    $sock = IO::Socket::INET->new(PeerAddr => '213.251.145.246',
                                    PeerPort => '27017',
                                    Proto    => 'udp') or die "Impossible de se connecter\n";
    $sock->send($request);
    $sock->recv($data,$buffsize);
    $sock->close;
     
    if ($data) {
    	print "On a une reponse:\n";
    	#$values = unpack('C',$data);
    	@chars = split("", $data);
    	foreach (@chars) {
    		push(@hex, uc(unpack('H*',$_)));
    	}
    } else {
    	die "Pas de reponse\n";
    }
     
     
    # print the table of response hex contents
    for ($i= 0; $i <= $#hex; ) {
    	for ($j = 0; $j < 16; $j++) {
    		if ($hex[$i]) {
    			print "$hex[$i] ";
    		} else {
    			print "   ";
    		}
     
    		if (! $hex[$i]) {
    			$string .= " ";
    		} elsif (hex($hex[$i]) < 32 || hex($hex[$i]) > 126) {
    			$string .= ".";
    		} else {
    			$string .= $chars[$i];
    		}
    		$i++;
    	}
     
    	print "$string\n";
    	$string = "";
    }
    La réponse reçue est celle attendue par le serveur.
    Je vais tenter de voir comment ca fonctionne !
    Merci pour l'aide apportée !

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

Discussions similaires

  1. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  2. Recherche ibrairie pour éxécuter des requêtes SQL via C++
    Par daemon dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 14/06/2004, 10h28
  3. log des requêtes sous sybase 10
    Par VsMetal dans le forum Sybase
    Réponses: 3
    Dernier message: 03/05/2004, 14h09
  4. Fichier log des requêtes d'une bdd
    Par Sub0 dans le forum Administration
    Réponses: 4
    Dernier message: 22/03/2004, 14h12
  5. formatage des requêtes sous psql
    Par Bouboubou dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/02/2004, 11h10

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