自动化专业综合设计
说明书
课题名称:Syslog日志服务器设计 学生学号: 专业班级: 学生姓名: 学生成绩: 指导教师: 课题工作时间: 至
xxxx教务处制
一、课程设计的任务的基本要求: 该课程设计主要的任务是编写一种可以被记录 到不同的文件,还可以通过网络实现运行syslog协议的机器之间的信息传递的叫做syslog协议的这么一个课题。Syslog已被许多日志函数采纳,它用在许多保护措施中——任何行为都可以通过syslog 记录事件。通过System Call,记录用户自行开发的应用程序的运行状况。日志系统的重点之一便是要研究及开发一些系统程序 ,该课题的设计过程要求先做好课题设计的大纲包括该课题应包括那些模块,要实现哪些功能,代码要用什么语言来写以及要用什么编译工具来编译运行该课题和运行的结果是什么样的,要用流程图把各个模块的连接关系一一的列出来,设计者应该有敢于创新和勇于负责的精神,从投入施工的角度来严肃对待自己的设计,使自己的设计能最大限度满足生产实际需要,既经济,又可靠。 二、课题设计框图: syslog syslog syslog Server函数 消息队列 File文件 save 指导教师签字: 教研室主任签字: 年 月 日 年 月 日 1
二、进度安排: 第一周: (1) 指导教师讲解设计要求、规程、部分相关国家标准及有关技术规范、参考资料等事项。 (2) 采用计算机辅助软件绘制工艺流程图结合设计题目熟悉代码流程。 第二周: (3) 在熟悉代码流程的基础上,针对典型流程图进行代码分析。 第三周: (4) 按代码功能模块的顺序画出代码流程图。 (5) 讲画好的代码框图与小组的其他成员讨论研究其缜密性和可行性,找出该流程的弊端和矛盾之处, 最终确定更好的代码顺序方案。 第四周: (6) 按照流程图编写代码,并且在编写代码的过程中要每写一个模块就要编译一次避免不必要的错误。 (7) 最后撰写详细的设计文档并让指导老师审核。 三、应收集资料及主要参考文献: [1]中软国际·LINUX系统程序设计 [2]谭浩强 C程序设计(第三版) [3]严蔚敏,吴伟民 数据结构(C语言篇) [4]张宇河,董宁·计算机控制系统·北京:北京理工大学出版社,2002 [5]谢希仁 计算机网络(第五版) [6]刘兵,吴煜煌 LINUX实用教程 四、课程设计摘要(中文): Syslog是一种工业标准的协议,可用来记录设备的日志。在UNIX系统,路由器、交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录,随时掌握系统状况。UNIX的系统日志是通过syslogd这个进程记录系统有关事件记录,也可以记录应用程序运作事件。通过适当的配置,我们还可以实现运行syslog协议的机器间通信,通 2
过分析这些网络行为日志,藉以追踪掌握与 设备和网络有关的状况。 从目前的情况来看,Syslog(系统日志)这一历史悠久的日志系统仍旧占据着最主流的地位。由于与类 UNIX平台之间的渊源,Syslog是在实际应用环境中最容易获得的日志系统。 同时,还有很多的基于Syslog的扩展产品存在,这其中也包括大量基于UNIX平台构建内核的网络硬件设备,这些设备往往都内置了Syslog功能支持,例如Cisco路由器就是如此。 六、成绩评定: 指导教师评语: 指导教师签字: 年 月 日 项目 调查论证 实践能力 分析、解决问题能力 得分 评价 项目 工作量、工作态度 质量 创新 评价
六、答辩记录: 3
该课题是基于LINUX环境下的设计,它实现的功能是任意的一个进程都能调用syslog函数,并且可以随意的将任何信息传送至文本文件中。该功能的实现和设计报告所写完全一致。 当遇到编译错误是设计者是这样做的:首先分清每个模块的功能,然后将整个代码流程逐行检查,并且在每个模块上加上一系列的打印信息,再次编译并观察代码运行到哪一行,然后在有问题的代码出处进行改正。 设计者采用先做粗略的设计文档在进行代码编写,这样做的好处是保证了代码的缜密性和严谨性。 答辩意见及答辩成绩 答辩小组教师(签字): 年 月 日
总评成绩: (教师评分×75%+答辩成绩×25%) 4
目录
摘要 ............................................................................................................................................................0 绪论 ............................................................................................................................................................1
1.引言 ..............................................................................................................................................1 2.网络管理的原则和要求 ..............................................................................................................1 3.集中式网络管理的实现 ..............................................................................................................1 第一章 Syslog协议 .................................................................................................................................2
1.1 Syslog简介 ...............................................................................................................................2 1.2 Syslog协议 ...............................................................................................................................2 1.3 Syslog体系结构........................................................................................................................3 1.4 Syslog包格式 ...........................................................................................................................3
1.4.1 PRI ..................................................................................................................................3 1.4.2 HEADER部分 ...................................................................................................................5 1.4.3 MSG部分 .........................................................................................................................5
第二章Syslog配置 ..................................................................................................................................6
2.1 概览 ............................................................................................................................................6 2.2选择符 .........................................................................................................................................6 2.3动作 .............................................................................................................................................7 2.4 C语言中的syslog ....................................................................................................................7 closelog ............................................................................................................................................9 第三章 功能模块的设计 ........................................................................................................................10
3.1 功能框架图 ..............................................................................................................................10 3.2 程序流程图 .............................................................................................................................. 11 第四章 代码介绍 ....................................................................................................................................12
4.1 编码步骤 ..................................................................................................................................12 4.2 代码解析 ..................................................................................................................................12
4.2.1 main函数的设计 .........................................................................................................12 4.2.2 syslog()函数的设计 ..................................................................................................13 4.2.3 server()函数的设计 ..................................................................................................16 4.2.4 save_to_file()函数的设计 ......................................................................................18
第五章 课程总结 ....................................................................................................................................20 参考文献 ..................................................................................................................................................20
摘要
Syslog是一种工业标准的协议,可用来记录设备的日志。在UNIX系统,路由器、交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录,随时掌握系统状况。UNIX的系统日志是通过syslogd这个进程记录系统有关事件记录,也可以记录应用程序运作事件。通过适当的配置,我们还可以实现运行syslog协议的机器间通信,通过分析这些网络行为日志,藉以追踪掌握与 设备和网络有关的状况。
从目前的情况来看,Syslog(系统日志)这一历史悠久的日志系统仍旧占据着最主流的地位。由于与类 UNIX平台之间的渊源,Syslog是在实际应用环境中最容易获得的日志系统。 同时,还有很多的基于Syslog的扩展产品存在,这其中也包括大量基于UNIX平台构建内核的网络硬件设备,这些设备往往都内置了Syslog功能支持,例如Cisco路由器就是如此。
关键词:Syslog,Syslogd,Priority(PRI),Facility,Severity,Header,Message(MSG),
Timestamp
绪论
本文档规定了syslog项目各模块的详细设计,函数设计,数据结构。用于在linux下进行syslog的开发标准。
1.引言
电信运营商的网络庞大而复杂,其上运行着多种网络设备、主机系统以及业务应用。而且随着电信业的不断发展,各种新业务的推出,不同的系统纷纷建立,网络的 复杂性不断增长,使得被管理的对象在系统中不是集中的而是分散的。分布式的管理必然要求网络管理员在网络的协议层次结构上对系统管理做出重新的认识,通过 适当的策略实现集中式管理,实现事件的实时监控和快速响应的网络管理。传统的网络管理员关心的问题不单是安装配置、备份恢复、系统安全、性能优化等,还必 须从OSI模型不同的层次重新考虑系统管理的内容和形式,再加上承载业务的特点,侧重于事件监控和响应的建设是当今网络管理的主要方向。
2.网络管理的原则和要求
从技术的角度来说,网络管理有两条原则:
1、由于管理信息而带来的通行量不应明显的增加网络的通信量。
2、被管理设备上的协议代理不应明显得增加系统处理 的额外开销,以致于该设备的主要功能都被削弱。网络管理的对象主要是构成网络的硬件和软件应用所组成。这一类包括工作站、服务器、网卡、路由器、网桥和集 线器等等。通常情况下这些设备都分散在不同的地方,另外由于设备众多,要做到实时实地管理需要大量的人力和物力。有什么办法可以对网络设备进行远程管理和状态进行预警呢?
3.集中式网络管理的实现
实际工作中,由于管理员不可能7×24小时监视着网络设备,网络运行中可能会发生很多突发情况。因此,使用日志记录设备的报警信息十分重要,管理员可以借此对安全事件进行原因追查和故障排除等工作。以路由器为例,一般都会设定内存保留Syslog。但路由器的内存(Buffer)容量有限,大量事件发生 时,会覆盖之前的记录,不利于实时预警和报告。而对UNIX系统来说,由于管理设备的多样性和数量的缘故,一台台登录访问日志效率低下也不现实。所以有必要建立专门的日志服务器,通过Syslog服务,接收设备发送出的报警信息。
1
第一章 Syslog协议
1.1 Syslog简介
Syslog是一种工业标准的协议,可用来记录设备的日志。在UNIX系统,路由器、交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录,随时掌握系统状况。在UNIX系统里,被syslog协议接受的事件可以被记录 到不同的文件,还可以通过网络实现运行syslog协议的机器之间的信息传递。
Syslog已被许多日志函数采纳,它用在许多保护措施中——任何行为都可以通过syslog 记录事件。通过System Call,记录用户自行开发的应用程序的运行状况。日志系统的重点之一便是要研究及开发一些系统程序,例如logger等,将网络应用程序重要的行为向 syslog接口呼叫并记录为日志,大部分内部系统工具如邮件和打印系统都是如此生成信息的,许多新增的程序如Tcpwrappers和SSH也是如此工 作的。通过syslogd(负责大部分系统事件的daemon),系统事件可以写到一个文件或设备中,或给用户发送一个信息。它能记录本地事件或通过网络 记录远端设备上的事件。
1.2 Syslog协议
syslog使用UDP协议作为它的传输层协议,其默认使用UDP端口514。
Syslog协议提供了一个传递方式,允许一个设备通过网络把事件信息传递给事件信息接受者(也称之为日志服务器)。由于每个进程、应用程序和操作系统都 或多或少地被完成,在syslog信息内容会有一些不一致的地方。因此,协议中并没有任何关于信息的格式或内容的假设。这个协议就是简单地被设计用来 传送事件信息,但是事件已经被接受到不会被通知。Syslog协议和进程最基本原则就是简单,在协议的发送者和接受者之间不要求有严格的相互协调。事实 上, syslog信息的传递可以在接受器没有被配置甚至没有接受器的情况下开始。反过来,在没有被清晰配置或者定义的情况下,接收器也可以接收到信息。
几乎所有的网络设备都可以通过syslog protocol将日志信息以UDP方式传送到远端服务器,远端接收日志服务器必须通过syslogd来监听UDP Port 514,并且据syslog.conf中的配置来处理本机和接收访问系统的日志信息,把指定的事件写入特定档案中,供后台数据库管理和响应之用。也就是 说可以让任何所产生的事件都登录到一台或多台服务器上,以便后台数据库。
2
1.3 Syslog体系结构
syslog模糊了发送方、接收方,设备、中继以及收集器的区别,一台设备可以同时是某种日志信息的中继、也可以是另外某种信息的收集器,同时可以作为发送者发送日志:
(1)发送方发送日志信息至某个主机,并不知道这台主机会如何处理这些日志。 (2)发送方可以通过配置,把同一条日志同时发送给多个接收者。
(3)中继可以发送所有或者部分信息给后序接收者,这种情况下它不完全是中继,也是一个收集信息者。
(4)中继可以产生自己的日志信息发送给后序接收者,这种情况下它也是一个产生信息的设备。
图2日志分析系统架构图
1.4 Syslog包格式
Syslog包分为3个部分,PRI, HEADER,以及MSG,总长度不能超过1024个字节。 1.4.1 PRI
PRI是priority的缩写,它代表了facility以及severity,即代表消息来源以及消息的严重程度。它必须是1、2或者3个十进制字符,用‘<’,‘>’括起后组成的串,它是由facility以及severity构成,组成的方法是把facility的值乘以8,再加上severity的值。如facility取值local4(20), severiry为warning(4),那么pri的值为<1>。
3
Facility的取值如下表所示: Numerical Code Facility 0 kernel messages 1 user-level messages 2 mail system 3 system daemons
4 security/authorization messages
5 messages generated internally by syslogd
6 line printer subsystem 7 network news subsystem 8 UUCP subsystem 9 clock daemon
10 security/authorization messages 11 FTP daemon 12 NTP subsystem 13 log audit 14 log alert
15 clock daemon (note 2) 16 local use 0 (local0) 17 local use 1 (local1) 18 local use 2 (local2) 19 local use 3 (local3) 20 local use 4 (local4) 21 local use 5 (local5) 22 local use 6 (local6) 23 local use 7 (local7)
严重等级分为:Numerical Code Severity
0 Emergency: system is unusable
1 Alert: action must be taken immediately 2 Critical: critical conditions 3 Error: error conditions 4 Warning: warning conditions
5 Notice: normal but significant condition 6 Informational: informational messages 7 Debug: debug-level messages
4
1.4.2 HEADER部分
HEADER部分包含一个时间戳以及发送方的主机名或者ip地址,并且HEADER部分必须是一些可打印字符。
时间戳部分是格式为”Mmm dd hh:mm:ss”的本地时间,其中Mmm是3个字母的英文缩写,如果日期小于10,必须用空格代替缺少的一个数字。
主机名部分一半使用主机名,如果没有的话可以使用IPv4或者IPv6的地址。需要注意的是主机名中不能包含任何空格。
时间戳和主机名后面都各自跟一个空格。
1.4.3 MSG部分
消息体部分一般包含生成消息的进程信息(TAG field)以及消息正文(CONTENT field)。TAG部分主要是包含生成消息的进程信息,不能超过32个字符。消息体必须是一些可见字符,这部分就是消息的正文。TAG与CONTENT之间的间隔用非字母表字母隔开,一般用”[“,”:”或者空格隔开。
5
第二章Syslog配置
2.1 概览
Syslog的全局配置文件一般存储在/etc/目录下,名为syslog.conf,由它指定syslogd程序对日志信息的处理。
配置文件由一系列的规则组成,一般每行一个规则,也可以使用反斜杠“\\”来续行。 配置文件中每个规则都是由两部分组成,分别叫做选择符以及其对应的动作。选择符就是指上文介绍过的priority,包括facility以及severity,动作指匹配成功的话应执行的动作,如把日志写入管道,写入文件,或者再转发至另一台主机。
2.2选择符
选择符包括两部分,facility以及severity,两部分以一个点号”.”分割。这两个部分都大小写无关,并且可以使用上文中定义的数字来代替字符。
Facility部分可以使用下列关键字:auth, authpriv, cron, daemon, ftp, kern, lpr, mail, mark, news, security (same as auth), syslog, user, uucp and local0 到local7,或者使用其对应的数字。
Severity部分可以使用下列关键字:debug, info, notice, warning, warn (等同于warning), err, error(同err), crit, alert, emerg, panic (同emerg)。
最初的BSD syslogd程序中,程序会把等于或者高于指定severity等级的日志按照指定动作来执行,现在syslogd程序中还包括一些有用的扩展:
“*”号,可以代表任何facility或者severity,根据在”.”之前或之后判断。 “,”号,可以分割facility,这样可以把几个facility可以合并。但是severity不
能这样合并。
“;”号,可以指定多个选择符,后面跟一个动作。处理得顺序是按照从前向后的顺序
匹配选择符,并且后面的选择符可以覆盖前面的。因此可以使用这种特性来排除一些特殊的等级。
“=”号,可以加在severity前面,表示准备匹配。
“!”号,表示忽略这种severity或者更高等级,也可以与”=”号一起用。
6
2.3动作
动作表示收到匹配的日志信息以后的处理动作,主要有写入文件,命名管道,终端,写入远程,提醒当前某些用户。
1. 写入普通文件。后面加入日志文件的绝对路径即可。也可以添加“-”号来表示不立即
写入。
如: *.=crit;kern.none /var/adm/critical 2. 命名管道。通过加上”|”即可把日志写入命名管道。
如:mail,news.=info | /tmp/message.fifo 3. 终端。只要动作中指定的文件是一个tty文件即可。
如:mail.=info /dev/tty12
4. 远端机器。添加”@”符号,加上远端主机名/ip地址即可。syslog需要-h参数启动才
会转发远端而来的消息。
如:kern.crit @finlandia
5. 用户。直接在动作之中写入用户列表的名字即可。以逗号分割各个用户。
如:*.alert root,joey
6. 所有已登陆用户。在动作中直接“*”号,表示把信息直接显示到已登陆用户的终端上。
如:*.=emerg *
2.4 C语言中的syslog
GNU C库中包含了写syslog的一些库函数,使用这些函数可以方便的对syslog进行写操作。Glibc中主要包含以下syslog相关函数:
1)openlog: 打开连接
2)syslog; vsyslog: 写syslog 3)closelog: 关闭连接
4)setlogmask: 置标志,可以实现忽略某些消息openlog
openlog函数在syslog.h中被声明,其原型如下:
void openlog (const char *ident, int option, int facility); openlog不是必须被调用的,但是可以方便syslog的使用。
indent表示一串字符串,以后调用syslog写日志时这个字符串都会被自动添加到正文之前,一般用来表示当前程序的名字。如果indent为NULL, 或者openlog没有被调用过,那么默认的名字是当前进程名。
option是一个位串,有以下掩码构成:
LOG_PERROR:记录至syslog的同时写到标准错误输出。默认不写入标准错误输出。 LOG_CONS:如果写入Syslog失败时写入控制台,默认不写入控制台。
7
LOG_PID:是否把进程ID也加入到信息中去。
LOG_NDELAY:打开的话,openlog会打开连接,否则syslog调用时才连接。 LOG_ODELAY:无意义,为兼容旧版本。
facility是此连接的默认的facility,参见上文facility相关内容。默认是LOG_USER。
syslog就是记录日志的主函数,它通过写socket /dev/log(syslogd进程一直在监听此socket文件)实现写日志,其原型如下:
void syslog (int facility_priority, char *format, ...)
facility_priority参数就是facility和severity的集合,可以使用LOG_MAKEPRI宏来生成此参数:
LOG_MAKEPRI(LOG_USER, LOG_WARNING) syslog(LOG_WARN|LOG_LOCAL1, “message”);
也可以直接使用syslog.h中定义的宏把facility与severity连接起来即可。如: 其中LOG_LOCAL1宏的定义为(17<<3)。
对应我们上文介绍的facility,有以下宏定义:
#define LOG_KERN (0<<3) /* kernel messages */
#define LOG_USER (1<<3) /* random user-level messages */ #define LOG_MAIL (2<<3) /* mail system */ #define LOG_DAEMON (3<<3) /* system daemons */
#define LOG_AUTH (4<<3) /* security/authorization messages */
#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ #define LOG_LPR (6<<3) /* line printer subsystem */ #define LOG_NEWS (7<<3) /* network news subsystem */ #define LOG_UUCP (8<<3) /* UUCP subsystem */ #define LOG_CRON (9<<3) /* clock daemon */
#define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */ #define LOG_FTP (11<<3) /* ftp daemon */
#define LOG_LOCAL0 (16<<3) /* reserved for local use */ #define LOG_LOCAL1 (17<<3) /* reserved for local use */ #define LOG_LOCAL2 (18<<3) /* reserved for local use */ #define LOG_LOCAL3 (19<<3) /* reserved for local use */ #define LOG_LOCAL4 (20<<3) /* reserved for local use */ #define LOG_LOCAL5 (21<<3) /* reserved for local use */ #define LOG_LOCAL6 (22<<3) /* reserved for local use */ #define LOG_LOCAL7 (23<<3) /* reserved for local use */ 对应严重等级的宏有:
LOG_EMERG LOG_ALERT LOG_CRIT LOG_ERR
8
LOG_WARNING LOG_NOTICE LOG_INFO LOG_DEBUG
后面的参数部分是一个可变长参数,使用方法和常用的printf相同。
closelog
closelog函数会关闭当前连接,如果有连接打开的话。函数原型为: void closelog (void);
setlogmask
setlogmask函数可以使后面调用syslog时忽略某些等级,与syslog.conf中配置的不同,int setlogmask (int mask);
如果被setlogmask函数忽略掉的日志,永远不会被发送至syslog。它的原型为:
其中mask是一个位串,其中每位表示一个等级,如果此位为1,那么syslog正常处理;如果为0,则忽略掉此信息。
通过宏LOG_MASK可以方便的表示可以忽略掉那些等级,如:
LOG_MASK(LOG_EMERG) | LOG_MASK(LOG_ERROR)
表示忽略EMERG和ERROR。 或者使用~,如:
~(LOG_MASK(LOG_INFO))
表示忽略INFO以外的等级。
也可以使用宏LOG_UPTO,表示某等级或者此等级以上。
9
第三章 功能模块的设计
3.1 功能框架图
错误!未指定书签。
主框架示意图
错误!未找到引用源。
Syslog主进程
3.2 程序流程图
错误!未找到引用源。 错误!未找到引用源。
文件操作流程图 syslog()接口
第四章 代码介绍
4.1 编码步骤
(1) 发送消息 //创建消息队列
读取标准输入 封装消息
10
发送消息
//循环(输入,封装,发送) //关闭队列 关闭程序 (2) 接收消息 创建消息队列 打开文件 读取消息队列 解析消息 写入文件 打印到终端
循环(读取,解析,写入,打印) 关闭文件 关闭消息队列 关闭程序
4.2 代码解析
4.2.1 main函数的设计
【功 能】
此文件是一段试运行代码,是主函数main调用syslog函数的程序,程序中的相关信息放进syslog机构体里。
test.c
/******************************************************************/ /******************************************************************/
#include #define uint8_t unsigned char #define uint32_t unsigned int #define uint16_t unsigned int int syslog(int mod_id, uint8_t *file_name, uint8_t *func_name, uint32_t line, const char *info,...); int main() 11 { } 4.2.2 syslog()函数的设计 【功 能】 提供外部调用,外部程序可以调用此函数想syslog主进程发送消息。创建和初始化一个消息队列 qid,以及参数的解析并且把消息发送至消息队列。 syslog.c /******************************************************************/ /******************************************************************/ #include #define MAX_LOG_LEN 512 #define PROJ_ID 32 #define PATH_NAME \"/tmp\" #define SERVER_MSG 1 #define uint8_t unsigned char #define uint32_t unsigned int #define uint16_t unsigned int syslog(1,\"11\ 12 typedef struct { int syslog(int mod_id, { va_end(argptr); offset=sprintf(buf,\"tm:%d/%02d/%02d file_name, func_name, line, out_buffer); tm_buf->tm_year+1900, tm_buf->tm_mon+1, tm_buf->tm_mday, tm_buf->tm_hour, tm_buf->tm_min, tm_buf->tm_sec, %02d:%02d:%02d,%s,FILENAME:%s,LINE:%ld,%s\\n\ uint8_t buf[MAX_LOG_LEN]; va_list argptr; char out_buffer[400]={0}; char *pMsg; uint16_t offset=0; time_t cur_time; struct tm *tm_buf; SYSLOG_READ_LOG_t msg; va_start(argptr,info); vsprintf(out_buffer,info,argptr); time(&cur_time); tm_buf=localtime(&cur_time); uint8_t *file_name, uint8_t *func_name, uint32_t line, const char *info,...) long msgtype; char pMsg[MAX_LOG_LEN]; } SYSLOG_READ_LOG_t; 13 } int msg_send(SYSLOG_READ_LOG_t msg) { } 4.2.3 server()函数的设计 【功 能】 循环不断的从消息队列中读取消息。 ftok 是把一个已存在路径名和一个整数标识符转换为一个key_t键值。 msgget 得到一个消息队列标识符或创建一个消息队列对象并返回消息队列标识符。 msgrv() 读消息函数。 if(msgsnd(qid,&msg,strlen(msg.pMsg)+1,0)==-1) { perror(\"client msgsend error!\\n\"); exit(1); msg.msgtype = SERVER_MSG; if ((msgkey = ftok(PATH_NAME, PROJ_ID)) == -1) { } if ((qid= msgget(msgkey, IPC_CREAT | 0660)) == -1) { } perror(\"msgget error!\\n\"); exit(1); perror(\"ftok error!\\n\"); exit(1); int qid; key_t msgkey; strcpy(msg.pMsg,buf); msg_send(msg); } 14 printf() //将读取到的消息显示到终端上。 save_to_file() //将读取到的消息保存至file文件中。 reserver.c /******************************************************************/ /******************************************************************/ #include #define PROJ_ID 32 #define PATH_NAME \"/tmp\" #define SERVER_MSG 1 #define MAX_LOG_LEN 512 #define FILESIZE 1024 #define uint8_t unsigned char #define uint32_t unsigned char #define uint16_t unsigned char void save_to_flie(); typedef struct { SYSLOG_READ_LOG_t msg; int main(void) { int qid; key_t msgkey; if ((msgkey = ftok(PATH_NAME, PROJ_ID)) == -1) long msgtype; char pMsg[MAX_LOG_LEN]; } SYSLOG_READ_LOG_t; 15 } { } if ((qid = msgget(msgkey, IPC_CREAT | 0660)) == -1) { } while(1) { /*receive message from message queue with CLIENT_MSG type */ if (msgrcv(qid, &msg,MAX_LOG_LEN, SERVER_MSG, 0) == -1) { } printf(\"Client: %s\\n\save_to_flie(); perror(\"Server msgrcv error!\\n\"); exit(1); perror(\"msgget error!\\n\"); exit(1); perror(\"ftok error!\\n\"); exit(1); } exit(0); 4.2.4 save_to_file()函数的设计 【功 能】 将消息保存至file文件中,在保存消息之前并判断文件内容是否超过1KB,如果判断超过则将文件从头开始覆盖,如果没超过则将信息紧接着文件末尾保存。 fp=fopen(\"file\将文件以读写的方式打开,如果返回值为NULL,则表示打开失败并且终止程序。 16 fread(p,20,1,fp)==0 //读取文件的内容,如果返回值为0则表示文件为空,否则表示文件中有内容。 fseek 是定义文件保存位置,方便服务器下次保存能够继续找到上次文件所保存的位置,从而达到使文件内容不超过1kb的作用。 fprintf(fp,\"%19d\\n\将一个整形数 filesize 写入到文件中。 void save_to_flie() { if(fread(p,20,1,fp)==0) { } else { for(i=0;i<20;i++) { } if(p[i]<='9'&&p[i]>='0') { } k[j]=p[i]; j++; fprintf(fp,\"%19d\\n\fseek(fp,20L,0); fprintf(fp,\"%s\\n\lenth=20+strlen(msg.pMsg); fseek(fp,0L,0); fprintf(fp,\"%19d\\n\if((fp=fopen(\"log.txt\{ } printf(\"can't open file!!!\\n\"); exit(0); FILE *fp; long lenth; char p[20],k[20]; int i,j=0; 17 k[j]='\\0'; sscanf(k,\"%d\lenth=lenth+strlen(msg.pMsg); if(lenth<=1024) { } else { } fseek(fp,20L,0); fprintf(fp,\"%s\\n\fseek(fp,0L,0); fprintf(fp,\"the current types:%d\\n\fseek(fp,lenth,0); fprintf(fp,\"%s\\n\fseek(fp,0L,0); fprintf(fp,\"the current types:%d\\n\ // lenth=20+strlen(msg.pMsg); // lenth=20+strlen(msg.pMsg); } } 第五章 课程总结 来到中软这段日子,我从无到有,收获不少,加强了理论学习和实践学习的相互融合,在做syslog这个小项目时,从一开始的无从下手到现在,我要特别感谢我的指导教师XX老师和自动化教研室主任X教授的热情关怀和悉心指导。在我做课程设计的过程中,XX老师亲心指导,定时检查任务进度,无论是在课题的选题、构思和资料的收集方面,还是在课题的研究方法以及论文定稿方面,我都得到了XX老师悉心细致的教诲和无私的帮助,我们在做sislog中学到了很多相关知识,同时也学到了对待事情那中坚持不懈的精神。 18 同时感谢同学们的悉心帮助,尤其是我们本班同学的互帮互助的精神令我尤为感动。 参考文献 [1]中软国际·LINUX系统程序设计 [2]谭浩强 C程序设计(第三版) [3]严蔚敏,吴伟民 数据结构(C语言篇) [4]张宇河,董宁·计算机控制系统·北京:北京理工大学出版社,2002 [5]谢希仁 计算机网络(第五版) [6]刘兵,吴煜煌 LINUX实用教程 19
因篇幅问题不能全部显示,请点此查看更多更全内容