Partage
  • Partager sur Facebook
  • Partager sur Twitter

htons(0) == Port au hasard

Mais là, je sais pas, ca marche pas ... ?

Sujet résolu
    31 octobre 2006 à 22:52:53

    Hello à tous !

    Je continue mon client FTP sous linux en C, et j'en suis à la création de la commande PORT. ^^
    Bon pour rappelle rapide, la commande port se constitue de :
    PORT x0,x1,x2,x3,y0,y1

    Avec les xN = aux octets de l'adresse IP de la carte réseau de la machine,
    Et les yN = au port / 256 pour y0, et au port % 256 pour y1 ;)

    Pour commencé, j'avais commencé à faire une petite fonction pour générer un nombre entre 0 et 65535 ( nombre max de ports de nos chères machines ).
    Mais je me suis rappelé que dans un court, il était écrit de mettre htons(0) pour le numéro de port dans la structure struct sockaddr_in afin que ce soit le système qui choisis un port.

    Voici donc mon code :

    struct sockaddr_in           connexionSecondaire;

    // Creation de la socket qui va acceuillir le serveur
    Erreur( lintSckSecondaire = socket(AF_INET,SOCK_STREAM,0), "socket()");
                   
    /* ReMPLiSSAGe dE LA STRUCTURe */
    connexionSecondaire.sin_family = AF_INET;
    connexionSecondaire.sin_port = htons(0);        // Ici, en mettant 0, le port sera séléctionné au hasard

    printf("[D]Numéro de port séléctionné : %d\n", htons(connexionSecondaire.sin_port));



    Réponse :
    [D]Numéro de port séléctionné : 0
    o_O

    Biensure, si je met htons(1025), le numéro de port sera 1024... :D

    Pouvez vous m'expliquer pourquoi dans mon cas, le numéro de port n'est pas choisir au hasard par le système ? :o
    • Partager sur Facebook
    • Partager sur Twitter
      1 novembre 2006 à 1:15:10

      Fais gaffe, sous Linux, certains ports sont reservés au système, et certains t'y as accès seulement si t'as les droits root (de 0 à 1024 je crois, corrigez moi si je me trompe) ;)
      Pour ta question, est tu vraiment obligé de sélectionner un port aléatoirement ? :)
      • Partager sur Facebook
      • Partager sur Twitter
        1 novembre 2006 à 1:31:16

        Les 1024 premiers ports sont des ports réservé autant sous linux que sous windows.
        Cela dis, j'imagine que si je met 0, linux va me donner un port qui lui conviendra, et qui ne sera donc pas dans les 1024 premier ^^

        Mmm.. Je ne pense pas que ce soit obligé que le port soit aléatoire... mais c'est le cas dans les client FTPs actuel.
        Enfin remarque on peut paramétré un plage de port possible...
        • Partager sur Facebook
        • Partager sur Twitter
          3 novembre 2006 à 0:42:49

          Help Messieurs, Dames ! ;)
          • Partager sur Facebook
          • Partager sur Twitter
            3 novembre 2006 à 1:33:42

            Tu remarqueras que tu appliques deux fois htons à la même valeur... Puis, c'est normal que si tu donnes 0 tu retrouves 0.

            "The htons() function converts the unsigned short integer hostshort from host byte order to network byte order."
            • Partager sur Facebook
            • Partager sur Twitter
              3 novembre 2006 à 10:41:52

              Salut :)
              Déjà, comme l'a dis rz0, htons() convertit le short envoyé en Host Byte Order en Network Byte Order (et donc ne sélectionne pas de port au hasard...). Pour savoir le port sélectionné, je pense qu'il faut que tu utilises ntohs(connexionSecondaire.sin_port).
              Ensuite, c'est normal que le printf t'affiche 0 car la valeur que contient connexionSecondaire.sin_port n'a pas encore été modifiée : tu l'initialises à 0 en mettant htons(0) pour demander à printf() de te l'afficher juste après.


              [EDIT] => Je pense qu'il faut que tu fasses le bind() (ou connect() sans bind() si c'est un client) avant de demander l'affichage du port car ça doit être à ce moment que le port est sélectionné ;)
              • Partager sur Facebook
              • Partager sur Twitter
                3 novembre 2006 à 22:39:00

                Citation : monge.univ-mlv.fr

                Si le numéro de port indifférent (ce qui est toujours le cas pour les clients) la valeur htons(0) entrainera l'attachement sur un port libre de la machine.



                http://monge.univ-mlv.fr/~roussel/DESS/sockattach_inet.html

                C'est pour ca que je disais que htons(0) devais donner un port au hasard.. je me trompe ?
                Je vais tester le bind() juste avant ^^

                P.S : Merci beaucoup pour vos réponses ! ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  3 novembre 2006 à 23:24:39

                  Re ;) .
                  Au cas où, voici deux liens intéressants en ce qui concerne les sockets (ils ont déjà été pas mal de fois envoyés sur le forum, mais une fois de plus ça ne fait pas de mal :p )

                  Voici le premier.
                  Et ici le deuxième.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 novembre 2006 à 11:03:39

                    Bon ok, je vais étudier tes deux liens !! ^^

                    Merci ! :)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    htons(0) == Port au hasard

                    × 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