Heartbeat的可靠消息通信实现分析
http://tech.ddvip.com 2007年05月21日 社区交流
本文详细介绍Heartbeat的可靠消息通信实现分析
Heartbeat在process_outbound_packet()函数里实现了一个可靠的多播协议,它利用一个循环队列来存放历史消息,对于带有序列号的心跳消息,先存放到历史消息队列里然后发送,接收者可以请求发送传重传该消息,对于不带序列号的控制消息,不会进行重传。下面是这个函数的实现代码。
static int process_outbound_packet(struct msg_xmit_hist *hist,
struct ha_msg *msg)
{
...
const char *cseq;
seqno_t seqno = -1;
const char *to;
int IsToUs;
size_t len;
...
if ((type = ha_msg_value(msg, F_TYPE)) == NULL) {
...
return HA_FAIL;
}
if ((cseq = ha_msg_value(msg, F_SEQ)) != NULL) {
if (sscanf(cseq, “%lx”, &seqno) != 1 || seqno <= 0) {
...
return HA_FAIL;
}
}
to = ha_msg_value(msg, F_TO);
IsToUs = (to != NULL) && (strcmp(to, curnode->nodename) == 0);
/*把消息转换成字符串*/
smsg = msg2wirefmt(msg, &len);
...
if (cseq != NULL) {
/*存放到历史消息队列里,通过序列号记录,如果需要,则进行重传*/
add2_xmit_hist(hist, msg, seqno);
}
...
/*通过write子进程发送到所有的网络接口上*/
send_to_all_media(smsg, len);
...
return HA_OK;
}add2_xmit_hist()函数把发送的消息发到一个历史消息队列里去,队列的最大长度为200。如果接收者请求重传消息,发送者通过序列号在该队列里查找要重传的消息,如果找到则进行重传。下面是相关代码。
责编:豆豆技术应用
正在加载评论...
- Linux/Unix 新闻
- Linux/Unix 入门
- Linux/Unix 命令
- Linux/Unix 安装
- Linux 嵌入式系统
- Linux/Unix 编程
- Linux/Unix 管理
- Linux/Unix 桌面
- Linux/Unix 内核
- Linux/Unix 软件
- SCO Unix
- NetBSD
- OpenBSD
- Redhat/Fedora Linux
- 手机
- Linux/Unix find 搜索命令
- Linux/Unix vi 命令
- Linux/Unix kde 桌面环境
- Linux/Unix GNOME 桌面环境
- Linux/Unix Make 命令
- Linux/Unix crontab 命令
- Linux/Unix ext3 文件系统
- Linux/Unix 文件系统详解
- Linux/Unix ADSL 拨号设置
- Linux/Unix GRUB 配置及应用
- Linux/Unix nfs配置
- Linux/Unix 硬件信息查看及管理
- Linux/Unix 优化
- Linux/Unix 交换分区Swap管理及应用
- Linux/Unix 用户管理
- Linux/Unix Ramdisk
- Linux/Unix 密码恢复管理
- Linux/Unix 文件删除恢复
- Linux/Unix fdisk分区
- Linux/Unix lvs负载均衡管理
- Linux/Unix root用户
- Linux/Unix 集群
- Linux/Unix 日志
- 更多Linux/Unix专题……