Forum Programmation.python Décomposer une structure C

Posté par  (site web personnel) .
Étiquettes : aucune
0
22
mar.
2006
Bonjour,
Je vais bientôt débuter le python, mais j'aimerais savoir un peu comment va se passer mon développement dès maintenant (faisabilité, facilité).

J'ai un programme C qui envoie via une socket une structure (packée à coup de #pragma pack) à un programme python (que je vais développer). Est-ce simple de récupérer les informations de cette structure pour les exploiter ?

Est ce que je dois utiliser des bidouilles pour générer une interface python à partir de mon header C, ou je peux juste redéfinir ma structure dans mon code python ? (je sais pas si je suis clair là)

Merci d'avance
  • # idée

    Posté par  . Évalué à 3.

    La solution est d'utiliser SWING.

    un bon tutorial de départ http://wikipython.flibuste.net/moin.py/InterfaceAvecLangage

    Ca a l'air complexe, mais ca ne l'est pas tant que ca. :-)

    Cepedant, ca peut être plus simple d'ouvrir la socket en python directement. Ca dépends de tes besoins exacts.
  • # struct en C, struct en python

    Posté par  (site web personnel) . Évalué à 6.

    Utilise le module struct http://docs.python.org/lib/module-struct.html qui est justement fait pour ça.
    • [^] # Re: struct en C, struct en python

      Posté par  (site web personnel) . Évalué à 2.

      Yes ! Merci, c'est exactement ce que je cherchais ;-)
      • [^] # Re: struct en C, struct en python

        Posté par  (site web personnel) . Évalué à 3.

        Oui le module struct est bien, xdrlib est pas mal non plus.

        En revanche une petite remarque. Je ne sais pas pour quelle raison tu utilises une structure avec des #pragmas pack(), mais si c'est pour écrire toute ta structure d'un coup dans ta socket sans perte de place, tu fais probablement une erreur. En effet :
        - ton code sera lent quand il manipulera ta structure autrement que pour l'envoyer sur le réseau (des manipulations supplémentaires à cause de l'alignement pas 'naturel'). Cependant rien n'empêche de mettre les membres de ta structure dans un ordre intelligent (char ensemble par exemple).
        - tes trames réseau ne sont pas portables : en écrivant d'un coup toute ta structure, le comportement variera suivant les machines(32/64 bits, big endian/little endian...). Il faut faire une fonction qui va sérialiser ta structure dans un buffer, avec des fonctions comme htonl()/htons(), puis écrire ce buffer dans ta socket.

        Désolé du dérangement si tu savais tout ça!! :)
        • [^] # Re: struct en C, struct en python

          Posté par  (site web personnel) . Évalué à 2.

          Hum... Je veux bien que tu m'en dises plus... En fait j'ai toujours fait comme ça. Parce qu'il parait naturel de ne transmettre sur un réseau que les informations dont tu as besoin. Je suis d'accord pour l'ordre intelligent, mais tu ne peux pas toujours.

          Par contre je ne vois pas du tout en quoi les trames réseau ne sont pas portables... En fait je ne vois surtout pas pourquoi en respectant les contraintes d'alignement elles le seraient. Je ne connais pas d'autre méthode que le htonl & co pour être sur d'envoyer sur le réseau des infos dans l'ordre naturel (big endian). Je ne vois pas comment je peux m'affranchir de cette étape, à moins de conserver le byte order de la machine...

          Je suis preneur de tout conseil en la matière...
          • [^] # Re: struct en C, struct en python

            Posté par  (site web personnel) . Évalué à 1.

            Je ne me suis pas fait bien comprendre ; je m'explique donc.
            J'ai tilté lorsque j'ai vu que tu utilisais le #pragma pack(). Je me suis dit que tu devais faire un truc du style "write(mysocket, &mystruct, sizeof(mystruct));", ce qui est mal, car pas portable (au sens ou des machines différentes peuvent produire des trames différentes, donc ne pas se comprendre), en espérant produire une trame de la taille minimum.
            Pourtant tu as l'air de connaitre htonl() et c'est très bien ; donc peut être utilises tu le #pragma pack() pour une autre raison. Mais j'espère qu'elle est bonne, puisque ton code risque d'être plus lent comme je te l'ai dit.

            Donc non je ne dit pas que garder l'alignement rend les trames portables, je dit que comme tu vas serialiser les membres de ta structure un a un dans un gros buffer, tu vas pouvoir aligner les données comme bon te semble : l'alignement dans tes trames n'a rien à voir avec celui de ta structure en mémoire (donc ce que modifie pack()).

            Bon code ! :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.