首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网络协议的终结性

网络协议的终结性
EN

Stack Overflow用户
提问于 2014-07-01 20:36:05
回答 1查看 147关注 0票数 0

我想听听你的建议。我需要使用tcp客户机/服务器来实现一些协议。它有几个网格,其中一些字节数为奇数,如:

代码语言:javascript
复制
typedef struct _msg1
{
unsigned short opcode
unsigned char  value
}msg1;

您认为实现它的最佳方法是什么,以避免字节排序问题。我想出了以下原则:

  1. 在结构定义上使用语用包(1)以避免填充
  2. 例如,在读/写结构时使用htonl/htonl: mymsg1.opcode =hton(0x1234); mymsg1.value = 0x56;

有些网格比较难看,比如在运行之前它的字节数是未知的,我仍然不确定如何最好地定义它来发送。

代码语言:javascript
复制
typedef struct _msg_errors
{
unsigned short opcode
unsigned char errortable[DEPENDS_ON_NUMBER_OF_REAL_ERRORS]
}msg_errors;

谢谢,Ran

EN

回答 1

Stack Overflow用户

发布于 2014-07-01 21:27:56

我倾向于避免将“覆盖转换”作为读取结构化数据的一种手段。如果性能不重要,那么定义以下方法可能会有所帮助:

代码语言:javascript
复制
int getBE16(uint8_t **p) { // Big-endian 16-bit
  uint8_t *pp = *p;
  int result = pp[0]*256 + pp[1];
  (*p)+=2;
}
int getLE16(uint8_t **p) { // Little-endian 16-bit
  uint8_t *pp = *p;
  int result = pp[0] + 256*pp[1];
  (*p)+=2;
}
int getBE32(uint8_t **p) { // Big-endian 32-bit
  uint8_t *pp = *p;
  int result = ((pp[0]*256 + pp[1])*256 + pp[2])*256 + pp[3];
  (*p)+=4;
}
int getLE32(uint8_t **p) { // Little-endian 16-bit
  uint8_t *pp = *p;
  int result = pp[0] + 256*(pp[1] + 256*(pp[2] + 256*pp[3]));
  (*p)+=4;
}

给定一个数组uint8_t dat[6]和一个由8位值、16位小端点值和32位大值按顺序组成的结构,然后我们会写:

代码语言:javascript
复制
uint8_t *p = dat;
mystruct.theByte = *p++;
mystruct.theHalfword = getLE16(&p);
mystruct.theWord = getBE32(&p);

上述代码将是可移植的,与字节顺序无关。如果可以消除函数调用和指针算法,则会更好,但要消除这些调用,则需要显式地指定数据结构中每个字段的偏移量,或者使用一些非常讨厌的宏来这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24518848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档