我想在发送消息的结构上抛出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;
最佳答案
首先,作为一个问题,客户是否可以接受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类。
重新考虑您的选择。不要重新发明轮子。
关于c++ - 通过std::asio tcp套接字发送结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36326392/