共用体
共用体又叫做联合体,是C语言中几个不同的变量共占一段内存的结构。
下面是在OSPF协议代码中定义的一个共用体,并且使用到了段域的概念。
#if (_BYTE_ORDER == _LITTLE_ENDIAN ) typedef _struct { BIT_FIELD (enum, BOOLEAN) transit:1; /* This is a transit area */ BIT_FIELD (enum, BOOLEAN) virtual_up:1; /* One or more virtual links in this area are up */ BIT_FIELD (enum, BOOLEAN) stub:1; /* This is a area (no external routes) */ BIT_FIELD (enum, BOOLEAN) nssa:1; /* This is a not so stubby area */ BIT_FIELD (enum, BOOLEAN) stub_default:1; /* Inject default into this stub area */ BIT_FIELD (enum,BOOLEAN) not_used:3; } _pack OSPF_AREA_FLAGS; #else /* _BYTE_ORDER == _BIG_ENDIAN */ typedef _struct OSPF_AREA_FLAGS { BIT_FIELD (enum,BOOLEAN) not_used:3; BIT_FIELD (enum, BOOLEAN) stub_default:1; /* Inject default into this stub area */ BIT_FIELD (enum, BOOLEAN) nssa:1; /* This is a not so stubby area */ BIT_FIELD (enum, BOOLEAN) stub:1; /* This is a area (no external routes) */ BIT_FIELD (enum, BOOLEAN) virtual_up:1; /* One or more virtual links in this area are up */ BIT_FIELD (enum, BOOLEAN) transit:1; /* This is a transit area */ } _pack OSPF_AREA_FLAGS; #endif /* _BYTE_ORDER == _LITTLE_ENDIAN */ typedef _union UNION_OSPF_AREA_FLAGS { OSPF_AREA_FLAGS _bit; BYTE _byte; } _pack UNION_OSPF_AREA_FLAGS;
下面是rip协议中使用套接字接收数据,存放数据包的结构使用了共用体。
#define MAXPACKETSIZE 512 /* From rip/ripLib.h */ typedef struct rip_pkt { u_char rip_cmd; /* request/response */ u_char rip_vers; /* protocol version # */ u_char rip_domain[2]; /* Version 2 routing domain. */ union { struct netinfo ru_nets[1]; /* variable length... */ } ripun; #define rip_nets ripun.ru_nets } RIP_PKT; LOCAL void process (int fd) { struct sockaddr from; int fromlen, cc; union { char buf[MAXPACKETSIZE+1]; RIP_PKT rip; } inbuf; //定义了一个存放数据包的共用体,将char数组和rip数据包格式的结构体共用 bzero ((char *)&from, sizeof (from)); for (;;) { fromlen = sizeof (from); cc = recvfrom (fd, (char *)&inbuf, sizeof (inbuf), 0, &from, &fromlen); //将从socket中接收到的数据放入共用体buf中 if (cc <= 0) { ... //出错处理 } if (fromlen != sizeof (struct sockaddr_in)) break; routedInput (&from, &inbuf.rip, cc); //使用共用体中的rip数据包格式变量作为参数 } }
枚举类型
枚举类型是ANSI C新标准中增加的。
下面是OSPF协议中定义的枚举的类型。
/* the OSPF interface configure parameters enum */ typedef enum{ swOspfIfParam_cost = 1, swOspfIfParam_retranInter = 2, swOspfIfParam_tranDelay = 3, swOspfIfParam_prio = 4, swOspfIfParam_helloInter = 5, swOspfIfParam_deadInter = 6, swOspfIfParam_authKey = 7, swOspfIfParam_digestKey =8 }swOspfIfIfParam_t;