结构体与联合体
结构体:一个物体,其有多种属性,如学生:学号,姓名,所在班级等
联合体:多种物体,即老师:职工号,姓名,教学科目等同时也有学生(在实际使用中,定义一个结构体变量要么是老师,要么是学生,不能同时是老师和学生)
我们知道在计算机网络中。路由器的链路要么连接网络,要么连接其他路由器。不能既是网络又是路由器,此时既可以使用联合体进行对链路的定义。
以下是利用结构体定义两种链路的伪代码
// 路由表项标志
#define ROUTER_LINK 0
#define NETWORK_LINK 1
// 链路协议类型
typedef enum {
PROTOCOL_OSPF,
PROTOCOL_BGP,
PROTOCOL_EIGRP,
PROTOCOL_STATIC
} LinkProtocol;
// 路由器-路由器链路信息
typedef struct {
unsigned int neighbor_router_id; // 邻居路由器ID
LinkProtocol protocol; // 使用的路由协议
unsigned int bandwidth_kbps; // 链路带宽(kbps)
unsigned char hop_count; // 跳数
unsigned int metric; // 路由度量值
} RouterToRouterLink;
// 路由器-网络链路信息
typedef struct {
unsigned int network_address; // 网络地址(IPv4格式)
unsigned int subnet_mask; // 子网掩码
unsigned int gateway; // 网关地址
unsigned int dhcp_server; // DHCP服务器地址(可选)
unsigned char prefix_length; // 前缀长度(用于CIDR)
} RouterToNetworkLink;
// 链路联合体
typedef union {
RouterToRouterLink router_link;
RouterToNetworkLink network_link;
} LinkData;
// 完整的链路结构体
typedef struct {
unsigned char link_type; // 0=路由器链路, 1=网络链路
unsigned char interface_id; // 接口ID
unsigned char is_active; // 链路是否激活
unsigned char admin_state; // 管理状态
unsigned int ip_address; // 接口IP地址
LinkData data; // 链路具体数据(联合体)
} RouterLink;
int main() {
// 方法1: 直接定义并初始化
// 定义路由器-路由器链路
RouterLink router_to_router_link = {
.link_type = ROUTER_LINK,
.interface_id = 1,
.is_active = 1,
.admin_state = 1,
.ip_address = 0xC0A80101, // 192.168.1.1
.data = {
.router_link = {
.neighbor_router_id = 1002,
.protocol = PROTOCOL_OSPF,
.bandwidth_kbps = 100000,
.hop_count = 1,
.metric = 10
}
}
};
// 定义路由器-网络链路
RouterLink router_to_network_link = {
.link_type = NETWORK_LINK,
.interface_id = 2,
.is_active = 1,
.admin_state = 1,
.ip_address = 0x0A000001, // 10.0.0.1
.data = {
.network_link = {
.network_address = 0x0A000000, // 10.0.0.0
.subnet_mask = 0xFFFFFF00, // 255.255.255.0
.gateway = 0x0A0000FE, // 10.0.0.254
.dhcp_server = 0,
.prefix_length = 24
}
}
};
return 0;
}
所以也正是根据这些链路信息,可以构造出一个图,各个路由器知道一个区域的所有路由信息,就可以使用迪杰斯特拉算法,来计算转发数据包的最好的路径,这也就是RIP协议









