2011-05-16 2 views
3

Je reçois une structure sur un réseau d'un serveur C vers mon client Python. Le protocole est UDP. Je n'ai aucun contrôle sur le serveur et ses protocoles/formats de données. Il se compose de ce struct (oui, un IPv4 + port):Désérialisation des données C

struct ip_s { 
    uint8_t i1; 
    uint8_t i2; 
    uint8_t i3; 
    uint8_t i4; 
    uint16_t port; // big endian 
}; 

En dehors du port qui est converti en big-endian les données sont envoyées "en l'état", à un (char*) casted. Comment puis-je recevoir cette structure dans un format qui peut être traité par Python?


information Divers:

  • Python 2.7 ou 3.x
  • multi-plateforme
  • solution De préférence, en utilisant uniquement des modules intégrés

Répondre

3

Regardez dans struct.unpack

It w malade regarde probablement quelque chose comme ceci:

# socket setup 

(buffer, sockaddress) = mysocket.recvfrom(6) 
if len(buffer)== 6: 
    i1,i2,i3,i4, port = struct.unpack('!BBBBH', buffer) 
+0

Ouais déjà trouvé juste après avoir demandé, mais je vais laisser la question ici pour référence ultérieure. – orlp

+2

Oh, et '" BBBBH "' aurait dû être ""! BBBBH "' pour le port big-endian. – orlp

+0

J'ai pris la liberté de modifier votre réponse. – orlp

0

Je reçois un struct sur un réseau

arrêter là. Ne fais pas ça. Cette technique introduit les dépendances suivantes:

  1. Ordre des mots: big-endian ou little-endian.
  2. Rembourrage.
  3. Emballage.

(2) et (3) à son tour, dépendent de:

  1. Le compilateur.
  2. La version du compilateur.
  3. Les #pragmas environnants.
  4. Les options du compilateur en vigueur lors de la compilation du programme C.

C'est plutôt beaucoup de dépendances. Ne fais pas ça. Définissez un protocole d'application et utilisez-le. Ou utilisez quelque chose comme XDR qui résout le problème pour vous.

+0

Peut-être ne devriez-vous pas «arrêter là», du moins pas en lisant: «Je n'ai aucun contrôle sur le serveur et ses protocoles/formats de données.» – orlp

+0

@nightcracker Donc, soit le serveur est incompétent. contrôle, ou, plus probablement, c'est juste une façon de décrire le protocole d'application, et c'est vraiment un protocole de fil composé de quatre octets suivi d'un entier de deux octets dans l'ordre des octets du réseau. – EJP

+0

Il n'y a pas de différence entre votre description et la mienne, car l'implémentation utilise 'uint8' et les j'aime qui ne laissent pas d'espace pour l'implémentation. Je suis vraiment coincé avec la conception du serveur, c'est un serveur maître pour CoD4 basé sur [ce code] (http://svn.icculus.org/twilight/trunk/dpmaster/src/messages.c?revision=10433&view = balisage). – orlp