2016-03-31 4 views
0

Ich mag würde Nachrichten Strukturen senden werfen die TCP/IP-Socket. Ich entschied mich für die Bibliothek std :: asio (oder boost :: asio). Meine Entscheidung basiert auf der Tatsache, dass Boost Asio eine Multi-Plattform ist und einer meiner Kunden auf Windows-Rechnern laufen muss.Senden Strukturen über std :: Asio TCP-Socket

Bitte nehmen Sie sich einen Blick auf die Nachrichten-Strukturen.

#pragma once 

#define SENSOR_LENGTH 5 
#define OPERATOR_NAME_LENGTH 100 


// extend it on demand 
typedef enum msg_type_t { 
    NO_MSG, 
    INIT_MAMBA_REQ, 
    INIT_MAMBA_RESP, 
    INIT_TELESCOPE_REQ, 
    INIT_TELESCOPE_RESP, 
    START_EVENT_MAMBA_REQ, 
    START_EVENT_MAMBA_RESP, 
    START_EVENT_TIMEPIX_REQ, 
    START_EVENT_TIMEPIX_RESP, 
    STOP_EVENT_MAMBA_REQ, 
    STOP_EVENT_MAMBA_RESP, 
    STOP_EVENT_TIMEPIX_REQ, 
    STOP_EVENT_TIMEPIX_RESP 
} MSG_TYPE; 

typedef struct msg_hdr_t { 
    MSG_TYPE MsgType; 
    long seqNum; 
} __attribute__((packed))MSG_HDR; 


typedef enum _runType 
{ 
    CUSTOM=0, 
    BIAS, 
    ANGLE 
} __attribute__((packed)) RunType; 

typedef struct init_event_t{ 
    RunType runType; 
    int dutRunNumber; 
    int biasVoltage; 
    int angle; 
    int stageX; 
    int stageY; 
    double temperature; 
    unsigned short sector; 
    char sensorName[SENSOR_LENGTH]; 
    char operatorName[SENSOR_LENGTH]; 
}__attribute__((packed))InitEventReqStruct; 


typedef struct init_event_rsp{ 
    int keplerRunNumber; 
}__attribute__((packed))InitEventRespStruct; 

typedef struct stop_event_req{ 
    bool isGood; 
}__attribute__((packed))StopEventReqStruct; 


typedef union msg_data_t { 
    bool empty; 
    InitEventReqStruct initEventReq; 
    InitEventRespStruct initEventResp; 
    StopEventReqStruct stopEventReq; 
} __attribute__((packed))MSG_DATA; 
+1

Und die Frage ist ....? – WhozCraig

+0

Ich habe vergessen, es hinzuzufügen. Natürlich ist die Frage, wie kann ich das tun? – user1877600

+2

Ich fürchte, es wird * Code * dauern. Sobald * Sie * versuchen, und vielleicht in Probleme geraten, ist dies ein großartiger Ort, um Ihre Code, Absichten, Reproduktion Schritte, etc., und haben sie für das Aussortieren von Problemen und die Bereitstellung von Fixes untersucht. – WhozCraig

Antwort

1

Zuerst wird, wie sich die Frage, ob C++ oder boost::asio Komplexität für den Kunden zumutbar ist. Die Tatsache, dass Sie C++ tun können (ich tue und ich mag), bedeutet nicht, dass es vernünftige Wahl aus Business-Perspektive ist. Leute, die diese komplexen Technologien kennen, können nur schwer eingestellt werden. Python, C#, Java oder Ruby sind leichter zugänglich.

Putting Sprache Überlegungen beiseite, müssen Sie Ihre Struktur serialisiert werden, bevor sie über den Draht zu senden und es beim Empfang deserialisieren.

Es gibt viele Möglichkeiten, es zu tun. Sie können diese Strukturen in XML oder JSON konvertieren, wie es die Internet-Crowd tut. Sie können Ihren eigenen binären Serializer-Deserializer schreiben, der schlechte Wartbarkeit für Super-Performance bietet. Oder Sie können einige Generatoren verwenden, um ser-des-Muster zu erstellen.

Check out Protokollpuffer: https://developers.google.com/protocol-buffers/

einen Blick auf Boost.Serialization Nehmen: http://www.boost.org/doc/libs/1_60_0/libs/serialization/doc/index.html

Ich würde wahrscheinlich zunächst einen Blick auf XML/JSON nehmen, bevor sie in komplexeren Lösungen zu springen. JSON und XML werden verwendet, um strukturierte Daten zwischen allen erdenklichen Technologien über das Internet zu senden. Java kann Ihnen beispielsweise fantastische Bibliotheken anbieten, um JESON in Java-Klassen ohne eine einzige Codezeile zu deserialisieren.

Rethink Ihrer Wahl. Erfinde das Rad nicht neu.

+0

Mit Blick auf die Strukturen denke ich, dass OP mit dem Kepler-Weltraumteleskop nach Planeten sucht. Zweifel, dass dies von einer geschäftlichen Perspektive aus betrachtet wird ... C++ ist Mainstream im wissenschaftlichen Rechnen. Gute allgemeine Beratung. –

0

ich mit der Gesamtstimmung hier zustimmen, dass eine Serialisierung Bibliothek ist der Weg zu gehen. Sie neigen dazu, Probleme zu behandeln, die Ihnen möglicherweise erst später begegnen (unterschiedliche Endianz zwischen Plattformen, Versionierung von Nachrichten und so weiter). Für binäre Serialisierung, eine der folgenden Aktionen sind eine Überlegung wert und haben aktive Gemeinschaften hinter ihnen:

Der von Ihnen gewählte hängt von Ihren Bedürfnissen und Vorlieben ab. Einige unterstützen die Versionierung von Nachrichten, optionale Felder und die Abwärtskompatibilität besser. Einige erfordern, dass Sie eine IDL über einen Compiler ausführen, der generierte Klassen ausspuckt. Einige erfordern lediglich das Hinzufügen eines zusätzlichen Codes zu Ihren eigenen vorhandenen Typen. Unterstützte Datentypen können geringfügig variieren.

+1

Boost Serialisierung ist nicht für tragbare binäre Kommunikation geeignet. – stefan

+0

@stefan Großer Vorbehalt, danke! Noch ein Detail, das OP zu beachten hat. –