用C语言编写Socket并反序列化响应

我正在编写一个程序,使用无连接(UDP)套接字与某个患者监视器进行通信。 我需要一个建议,用于解析从患者监护仪接收到的数据的最快和最有效的算法。

患者监护仪将数据作为AttributeList结构发送,结构的定义如下: -

typedef struct {
  uint16 count;
  uint16 length;
  AVAType * values;
} AttributeList;

typdef struct {
  uint16 id;
  uint16 length;
  void * data;
} AVAType

所以AttributeList包含许多AVAType结构,每个AVAType结构都包含id和数据作为void指针(数据只是AVAType中实际数据的占位符)。 实际上,为AVAType和每个ID定义了大约150个ID,为了解析目的,数据必须放置在相应的数据结构中。

所以如果AVAType结构中的ID是1,那么数据必须使用算法A来解析,但是如果ID是2,那么数据必须使用算法B来解析,等等......

我目前的做法是使用150个if-else语句并加载AVAType的特定数据结构,然后解析结果。 患者监护仪也按网络顺序发送数据,我需要根据ID解包AVAType。

请提出一些处理这种情况的好方法。 这仅仅是一件大学的事情,我对安全性并没有太多的关注,我认为安全性可以逐渐提高,但现在我的速度正在加快。

是的,它实际上是AVAType值[] ;. 你能更具体地说明为什么这与AVAType *有所不同? 如果我用其他方式定义我的结构,它可以有用吗?


从整数映射到函数的通常方法只是一个函数指针数组

typedef void (*Fun_ptr)(int id, void *current_byte);

Fun_ptr fun_ptr[0xFFFF+1] = { funcA, funcB, ...};

如果id只有一个字节,我会映射所有256个(如果它可以被限制)。

即使所有16位ID都不是很多存储空间。

我将未使用的id指向'错误捕获'函数。

使用:

next_buffer_position = fun_ptr[id](id, current_buffer_position);

然后函数知道它被调用的是哪个id,使得error_catch函数易于编写,您只需要一个。


你确定它是AVAType * values;void * data;
valuesdata应该是data包内的偏移量?
这不是不可能的,而且可能是正确的。 目前AVAType和AttributeList是固定的大小。

字段AVAType * values;void * data; 是指针的接收计算机大小。 这可能是任何事情,但可能是32位或64位。 如果将软件移动到不同的机器上,这是一个潜在的问题,这也是我问的原因。 它们不包含数据,它们指向数据,但它们的大小取决于接收机器。 Suspicous。 仔细检查他们被定义为什么大小。

在网络协议上处理数据包的常见方式是将空数组作为结构中的最后一个字段,例如

typdef struct {
  uint16 id;
  uint16 length;
  unsigned char data[];
} AVAType;

在这种方法中,通常在靠近数据包开始处的固定位置处有一个数据包长度,并且给出了数据包其余部分的实际大小。 所以协议定义了整个数据包还是data[]是长度字节。 这有点'hackish',但它很容易使用。 (NB IIRC unsigned char data[];不合法C ++)

简介:内存结构很可能就是您所展示的类型定义,但由于指针的大小可变,线上协议有点奇怪。

链接地址: http://www.djcxy.com/p/61901.html

上一篇: Socket Programming in C and Unserialize the Response

下一篇: Converting big endian structures to little endian