#pragma pack用法

在网络协议编程中,经常会处理不同协议的数据报文。一种方法是通过指针偏移的
  方法来得到各种信息,但这样做不仅编程复杂,而且一旦协议有变化,程序修改起来
  也比较麻烦。在了解了编译器对结构空间的分配原则之后,我们完全可以利用这
  一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。这样做,
  不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义即可,
  其它程序无需修改,省时省力。下面以TCP协议首部为例,说明如何定义协议结构。
  其协议结构定义如下:
  #pragma pack(1) // 按照1字节方式进行对齐
  struct TCPHEADER
  {
  short SrcPort; // 16位源端口号
  short DstPort; // 16位目的端口号
  int SerialNo; // 32位序列号
  int AckNo; // 32位确认号
  unsigned char HaderLen : 4; // 4位首部长度
  unsigned char Reserved1 : 4; // 保留6位中的4位
  unsigned char Reserved2 : 2; // 保留6位中的2位
  unsigned char URG : 1;
  unsigned char ACK : 1;
  unsigned char PSH : 1;
  unsigned char RST : 1;
  unsigned char SYN : 1;
  unsigned char FIN : 1;
  short WindowSize; // 16位窗口大小
  short TcpChkSum; // 16位TCP检验和
  short UrgentPointer; // 16位紧急指针
  };
  #pragma pop() // 取消1字节对齐方式
  #pragma pack规定的对齐长度,实际使用的规则是: 结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较大的那个进行。 但是,当#pragma pack的值等于或超过最长数据成员的长度的时候,这个值的大小将不产生任何效果。 而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。
  指定连接要使用的库比如我们连接的时候用到了 WSock32.lib,你当然可以不辞辛苦地把它加入到你的工程中。但是我觉得更方便的方法是使用 #pragma 指示符,指定要连接的库:#pragma comment(lib, "WSock32.lib")

你可能感兴趣的:(#pragma pack用法)