C中的套接字编程和反序列化响应

时间:2012-03-25 20:47:13

标签: c algorithm sockets endianness

我正在编写程序,使用无连接(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。

请提出一些处理这种情况的好方法。这只是一个大学的事情,我不太关心安全,我认为安全可以逐步改善,但现在我对速度的关注。

是的,它是actaully AVAType值[];。您能否更具体地说明为何与AVAType *不同?如果我以其他方式定义我的结构,它会有用吗?

1 个答案:

答案 0 :(得分:8)

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

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应该是数据包中的偏移量吗?
这不是不可能的,也可能是正确的。目前,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 ++)

总结:内存中的结构很可能就是你所显示的typedef,但由于指针的大小可变,因此线上协议有点奇怪。