我想发送消息结构抛出TCP / IP套接字。我决定使用std :: asio(或boost :: asio)库。我的决定是基于这样一个事实:boost asio是一个多平台,我的客户需要在Windows机器上运行。
请查看邮件结构。
#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;
答案 0 :(得分:1)
首先,作为客户可以接受C++
或boost::asio
复杂性的问题。您可以C++
(我喜欢和我喜欢)这一事实并不意味着从商业角度来看这是明智的选择。知道这些复杂技术的人很难雇用。 Python,C#,Java或Ruby更易于访问。
除了语言考虑因素之外,您需要在通过网络发送结构之前对其进行序列化,并在接收时对其进行反序列化。
有很多方法可以做到这一点。您可以将这些结构转换为XML或JSON,就像互联网人群一样。你可以编写自己的二进制序列化器 - 解串器,交易可维护性差,以获得超级性能。或者您可以使用一些生成器来创建ser-des样板。
检查协议缓冲区: https://developers.google.com/protocol-buffers/
看看Boost.Serialization: http://www.boost.org/doc/libs/1_60_0/libs/serialization/doc/index.html
在进入更复杂的解决方案之前,我可能会首先看看XML / JSON。 JSON和XML被用于在所有可以想象的技术之间通过互联网上的线路发送结构化数据。例如,Java可以为您提供出色的库,以便在没有单行代码的情况下将JSON反序列化为Java类。
重新考虑你的选择。不要重新发明轮子。
答案 1 :(得分:0)
我同意这里的整体情绪,即序列化库是可行的方法。它们倾向于解决直到以后可能不会发生的问题(平台之间的不同字节顺序,消息版本控制等)。对于二进制序列化,以下任何一个都值得考虑,并且背后有活跃的社区:
您选择的那个将取决于您的需求和偏好。有些人更好地支持消息版本控制,可选字段和向后兼容性。有些要求您通过编译器运行IDL,该编译器会吐出生成的类,有些只需要您为自己的现有类型添加一些额外的代码。支持的数据类型可能略有不同。