课程设计二:用网络与多线程方法解决故障检测问题.doc_第1页
课程设计二:用网络与多线程方法解决故障检测问题.doc_第2页
课程设计二:用网络与多线程方法解决故障检测问题.doc_第3页
课程设计二:用网络与多线程方法解决故障检测问题.doc_第4页
课程设计二:用网络与多线程方法解决故障检测问题.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络故障检测心跳检测系统工作任务:在Linux平台下,采用了C/S模式,服务器端充当主控节点,客户端充当外围节点,外围节点先发送TCP报文进行和主控节点建立连接,在建立连接成功后,发送心跳报文,心跳报文则采用UDP格式设计。而后每隔一秒发送一次心跳报文,主控节点根据心跳报文来检测网络连接是否正常。工作原理:在分布式系统中,有成千上万个设备节点通过有线或者无线网络连接。这些节点和网络随时可能发生故障,从而导致部分节点或者网络瘫痪。为了确保整个系统正常工作,主控节点应该能随时知道其他节点当前是否在正常工作。如果用人力去监控,则会造成很大的开销,且节点是否瘫痪有时无法从外表判断。心跳检测系统可以节省人力,根据外围节点定期发送的报文来判断设备和网络是否发生故障。心跳检测技术是分布式嵌入式系统中一种常见的故障检测方法。在心跳检测中,外围节点将周期性向主控节点发送心跳报文。如果过一段时间之后,主控节点没有收到外围节点的心跳报文,则认为此节点或相关网络出现故障,并向管理员报告。它有如下特点:基于C/S模式,主控节点(服务器端)判断外围节点(客户端)是否正常运行,一般采用定时发送简单的心跳报文,如果在指定时间段内未收到对方响应,则判断连接出现故障。用于检测网络的异常断开。发包方可以是客户端也可以是服务器端,看哪边实现方便合理。一般是客户端,服务器也可以定时轮询发心跳下去(本系统采用客户端发报文)。检测方法就是外围节点每隔几分钟发送一个心跳报文给主控节点,服务端收到后回复一个响应报文。如果服务端在规定时间内没有收到客户端信息则视连接断开。网络编程技术基础1、socket编程介绍socket编程有字节流和数据报两种主要类型,分别对应TCP协议和UDP协议。其中字节流socket定义了一种可靠的面向连接的服务,实现了无差错无重复的顺序数据传输。数据报socket定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且无法保证可靠无差错。无连接服务器一般都是面向事务处理的,一个请求一个应答就完成了客户和服务器之间的交互。下面就是本系统所用到的socket编程函数: 创建套接字:int socket( int domain, int type, int protocol ); 应用程序调用socket函数来创建一个能够进行网络通信的套接字。domain:指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;type:指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;protocol:指定应用程序所使用的通信协议,一般设置为0。该函数如果调用成功就返回新创建的套接字的描述符,套接字描述符是一个整数类型的值;如果失败就返回-1。 绑定套接字#includeint bind(int socket, const struct sockaddr *address, size_t address_len);socket:由socket()调用返回的套接字描述符;addreess:结构指针指向了与协议名称和协议相关的信息;address_len:指明了address数据结构的大小。如果调用成功,bind()函数返回0;否则返回-1,并设置错误代码到errno。 等待客户端连接服务器端应用软件通过调用accept()函数将自身阻塞,直至有新的客户端连接。#includeint accept(int socket,struct sockaddr *address,socketlen_t address_len);socket:创建并绑定的套接字;address:返回连接服务器的客户端地址信息;address_len:指明了address数据结构的大小。如果调用成功,则返回非负的连接套接字;否则返回-1,并设置错误代码到errno。 连接服务器客户端通过connect()函数和服务器进行TCP连接。#include int connect(int socket, const struct sockaddr *address, size_t address_len);socket:创建并绑定套接字;address:指明要连接服务器的ip地址和端口号;address_len:指明了address数据结构的大小。如果调用成功,返回0;否则返回-1,并设置错误代码到errno。 UDP协议的发送数据UDP协议需要通过sendto()函数实现一个数据包的发送,这是因为UDP协议提供的是以数据包为单位的传输,而TCP协议提供的是以字节流为单位的传输。#includessize_t sendto(int socket,const void*message,size_t length,int flags,const struct sockaddr*dest_addr,socklen_t dest_len);socket:已经创建的套接字;message:指明要发送的数据包的地址;length:数据包大小;flags:设置发送的属性,一般可设置为0;dest_addr:指明目的端的IP地址和端口号;dest_len:指明dest_addr数据结构的大小。如果调用成功,返回实际发送的数据数目;否则返回-1,并设置错误代码到errno。 UDP协议的接收数据UDP协议需要通过recvfrom()函数接收一个数据包。#includessize_t recvfrom(int socket,void* buffer,size_t length,int flags,struct sockaddr* address,socklen_t address_len);socket:已经创建的套接字;message:指明要接收的数据包的地址;length:数据包大小;flags:设置发送的属性,一般可设置为0;dest_addr:指明目的端的IP地址和端口号;dest_len:指明dest_addr数据结构的大小。如果调用成功,返回实际发送的数据数目;否则返回-1,并设置错误代码到errno。 向一个已连接的套接口发送数据。#include ssize_t send(int socket, const char void* buffer, int length, int flags);socket:一个用于标识已连接套接口的描述字;buffer:包含待发送数据的缓冲区;length:缓冲区中数据的长度;flags:调用执行方式;若无错误发生,send()返回所发送数据的总数;否则的话,返回-1并把错误保存到errno。 从一个已连接的套接口接收数据。#include ssize_t recv( int socket, char * buffer, int length, int flags);socket:一个标识已连接套接口的描述字;buffer:用于接收数据的缓冲区;length:缓冲区长度;flags:指定调用方式;若无错误发生,recv()返回读入的字节数。如果连接已中止,返回0;否则的话,返回-1并把错误保存到errno。 IP地址的转换和获取在上述套接字程序设计中,服务器和客户端的IPV4地址采用了32为无符号整数表示。在用户方面,广泛使用的是十进制字符串表示(例如2)或者主机名称(例如)。Linux操作系统提供了一系列函数实现这几种格式之间的转换。#includein_addr_t inet_addr(char* cp);cp:指向十进制字符串表示的IPV4地址。如果调用成功,返回IPV4地址的32位无符号整数表示;否则返回in_addr_t-l。 gethostbyname()函数可以实现从主机名称到32位无符号整数表示的转换。#includestruct hostent char *h_name; char *h_aliases; int h_addrtype; int h_length; char *h_addr_list;struct hostent *gethostbyname(const char *name);name:指明了主机名称的字符串。如果调用成功,返回指向hostent的指针;否则返回NULL,并设置错误代码到h_erno。其中hostent中的h_length指明了主机地址的长度,在Ipv4协议下始终为1。H_addr_list指明了主机的所有网络地址。一般情况下,h_addr_list0就表明了此主机Ipv4地址的32位无符号整数表示。 gethostbyaddr()函数可以实现从32为无符号整数到主机名称的转换。#includestruct hostent *gethostbyaddr(const void *addr,socklen_t len,int type);addr:指明了32位无符号整数表示的IPv4地址;len:指明了地址长度;type:在Ipv4协议下,可以设置为AF_INET。如果调用成功,返回指向hostent的指针;否则返回NULL,并设置错误代码到h_errno。 线程创建函数#includeint pthread_create(pthread_t *thread,pthread_ayyr_t *attr,void*(*start_routine)(void *),void *arg)thread:这是一个指向pthread_t类型数据的指针。线程被创建时,这个指针指向的变量中将被写入一个标识符,我们用该标识符来引用线程。attr:这个参数一般用于设置线程的属性,我们一般不需要设置特殊的属性,所以可以简单的设置该参数为NULL。start_routine :这个参数告诉线程将要启动的函数。arg:这个参数将传递启动函数的参数 。2、TCP开发介绍在基于TCP协议的程序设计中一般采用客户端/服务器的程序设计模式。在服务器端首先使用socket()函数创建套接字,然后使用bind()函数将本机IP地址和服务端口绑定至套接字,并通过listen()函数建立等待队列,随后就可以使用accept()函数等待客户端的连接。accept()函数将一直阻塞,直至有一个客户端连接到本地服务器端口为止。该函数将返回一个新的套接字值,随后服务器就可以通过新的套接字接口与连接上的客户端利用rend()或write()函数进行交互。客户端在访问服务器时首先要通过socket()函数调用,然后通过connect()函数连接服务器的IP地址和相应的服务器端口号。连接成功后,就可以通过read()或者write()函数与服务器进行数据交互了。socket():创建套接字bind():绑定本机地址和端口号listen():设置等待队列accept():等待客户端连接sendto()和recv()与客户端交换数据close()关闭特定客户端套接字socket:创建套接字connect()连接服务器sendto()和recv()与服务器端交换数据close()关闭套接字建立请求3、UDP开发介绍基于UDP协议的应用程序设计比较简单。首先通信双方都要利用socket()函数创建套接字,然后将本机IP地址和端口通过bind()函数与套接字绑定。绑定后,可以直接使用sendto()函数向对方发送消息。使用recvfrom()函数可以接收指定端口的UDP包,并通过返回的address结构获知发送方的IP地址和端口号。心跳检测过程包括以下几个步骤:连接的建立 外围节点启动,将首先与事先约定的主控节点IP地址建立TCP连接,并向主控节点注册该外围节点的设备号信息。主控节点在接收到外围节点的注册报文后,将回送许可报文。外围节点在接收到许可报文后,将进入心跳检测状态。如果外围节点在5秒内没有连接到主控节点,或者发出注册报文后5秒内没有收到主控节点的许可报文,则睡眠10秒钟后重新与主控节点进行连接。心跳检测 外围节点每隔1秒向主控节点发送一次心跳报文。主控节点每隔1秒查询各个节点的心跳报文,如果在1秒内没有收到外围节点的心跳报文,则显示相应外围节点的网络连接出现问题。设计主控节点和外围节点之间有三种报文:从外围节点到主控节点的登录报文(login),从主控节点到外围节点的响应报文(respond),以及从外围节点到主控节点的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论