第一篇:计算机网络课设
计算机网络应用课程设计
报告
系(院):
计算机科学学院 专业班级: 计科11511 姓
名: 钟灿均 学
号: 201503687 指导教师: 余绍文 设计时间: 2017.6.12-2017.6.23 设计地点: 12教1楼机房
一、课程设计目的和意义
计算机网络课程设计的目的,是为了让我们更深入地掌握计算机网络的核心内容,实现理论与实践相结合。让学生用具体的实践成果,体现对理论知识的掌握程度。有利于学生提高计算机网络的实践能力,加深对计算机网络理论知识的理解。其基本目的是:
1. 培养学生理论联系实际的设计思想,训练综合运用所学的基础理论知识,结合生产实际分析和解决网络应用中问题的能力,从而使基础理论知识得到巩固和加深。2. 学习掌握网络应用工程的一般设计过程和方法。
二、设计题目和要求
1.编写程序,实现系统的基本功能;
2.要有用户界面:要求至少采用文本菜单界面;鼓励采用图形菜单界面; 3.写课程设计报告,内容包括: 封面(参见附录I)
需求分析:以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?给出功能模块图和流程图。同时明确规定:输入的形式和输出值的范围;输出的形式;程序所能够达到的功能;测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。 概要设计:包括程序设计组成框图,程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。
详细设计:包括模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等),每个模块的算法设计说明(可以是描述算法的流程图)。其中源程序要按照写程序的规则来编写,结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。 运行结果:包括典型的界面、输入和输出数据等;
总结:包括课程设计中遇到的问题,解决问题的过程及体会、收获、对课程设计的认识与思考等。
附录:包括主要程序清单,要有适当的注释,使程序容易阅读。 开发环境:windows 10
开发工具: vs2008
题目3:基于UDP协议的简易聊天机器人
设计目标:
1.了解Socket通信的原理,在此基础上编写一个聊天程序; 2.理解upd原理;课程设计系统组成及模块功能: 此课程设计实现了基于UDP的客户/服务器通信程序,需要实现以下一些基本功能: 1.客户端连接聊天机器人服务器;
2.消息发送:客户端发送消息给机器人服务器。
3.消息接收:客户端接收到机器人服务器发送给他的消息。4.可以有多个客户端同时连接
5.智能回复功能:根据用户发送的消息内容,稍微有点智能回复。
运行效果:
服务器端和客户端截图
三、设计内容
1、UDP传送数据前并不与对方建立连接,即UDP是无连接的,在传输数据前,发送方和接收方相互交换信息使双方同步。
2、UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息(如TCP所采用的序号),而且报文不一定按顺序到达的,所以接收端无从排起。
3、UDP对接收到的数据报不发送确认信号,发送端不知道数据是否被正确接收,也不会重发数据。
4、UDP传送数据较TCP快速,系统开销也少。
5、由于缺乏拥塞控制(congestion control),需要基于网络的机制来减小因失控和高速UDP流量负荷而导致的拥塞崩溃效应。换句话说,因为UDP发送者不能够检测拥塞,所以像使用包队列和丢弃技术的路由器这样的网络基本设备往往就成为降低UDP过大通信量的有效工具。数据报拥塞控制协议(DCCP)设计成通过在诸如流媒体类型的高速率UDP流中增加主机拥塞控制来减小这个潜在的问题。
从以上UDP协议特点可知,UDP提供的是无连接的、不可靠的数据传送方式,是一种尽力而为的数据交付服务。
1.服务端
1.2.3.4.5.加载协议栈; 创建套接字;
将套接字绑定到一个本地地址和端口bind; 等待接收数据recvfrom;关闭套接字;
2.客户端
1.2.3.4.加载协议栈;
创建套接字socket;
向服务器发送数据sendto;关闭套接字; 3.相关代码显示:(客户端)
int main(int argc, char* argv[]){
system(“@color 0e”);WORD socketVersion = MAKEWORD(2, 2);WSADATA wsaData;if(WSAStartup(socketVersion, &wsaData)!= 0){ } sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);sin.sin_addr.S_un.S_addr = inet_addr(m);int len = sizeof(sin);return 0;以上代码为相关版本信息及热启动的一些操作;;
结构体端口号及相关地址信息以及转化函数,将输入的信息转化为计算机可识别的二进制代码,进行相关构造
char * sendData = new char[255];cout << “主人:”;cin >> sendData;while(strcmp(sendData, “#”)!= 0){
sendto(sclient, sendData, strlen(sendData), 0,(sockaddr *)&sin, len);char recvData[255];int ret = recvfrom(sclient, recvData, 255, 0,(sockaddr *)&sin, &len);if(ret > 0){
} recvData[ret] = 0x00;cout << “机器人:”;printf(recvData);4.相关代码展示:(服务端)
SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if(serSocket == INVALID_SOCKET){
} printf(“socket error!”);return 0;3
if(bind(serSocket,(sockaddr *)&serAddr, sizeof(serAddr))== SOCKET_ERROR){
} sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr);char * sendData = new char[255];char recvData[255];while(true){
int ret = recvfrom(serSocket, recvData, 255, 0,(sockaddr *)&remoteAddr, //printf(recvData);if(ret > 0){
} struct Ro { char recv[255];char send[255];recvData[ret] = 0x00;printf(“接受到一个连接:%s rn”, inet_ntoa(remoteAddr.sin_addr));cout << “主人:”;printf(recvData);printf(“bind error!”);closesocket(serSocket);return 0;以上为对套接字的绑定及判断绑定是否成功,以及对于相关信息的初始化
&nAddrLen);}Ro;FILE *fp;fp = fopen(“G:机器人问答机制.txt”, “r”);while(!feof(fp)){
} fscanf(fp, “%s %s”, Ro.recv, Ro.send);if(strcmp(recvData, Ro.recv)== 0){
} else { } strcpy(sendData, Ro.send);break;strcpy(sendData, “对不起,我不知道”);4
fclose(fp);cout << endl;cout << “机器人:” << sendData << endl;sendto(serSocket, sendData, strlen(sendData), 0,(sockaddr *)&remoteAddr, nAddrLen);
四、设计成果以及心得 1.成果
2.心得
通过对课设的相关的操作,加强了对于相关知识的理解,对于知识的应用也得以加强,在课设过程中,聊天机器人制作较为有趣,对于TCP与UDP的通信方式有了进一步的理解和加强,对于socket编程的相关基础也得以进一步的理解和学习。在今后的学习过程中希望可以将所学知识应用于实际,学以致用。而且对于课设中存在的问题和不足,以及通过老师的讲解,对一些算法加以分析和改进,从而不断完善课设内容,对内容的理解得以加深。
指导老师意见:
成绩:
教师签名: 2017年6月23日
第二篇:C1 CRC12计算机网络课设
计算机通信网络课程设计
C1 CRC-12 校验通信软件设计
所在学院: 信息科学与工程学院
专业班级: 通信工程
学生姓名:
学生学号:
指导教师: 时 间: 2015年9月20
引言:
循环冗余码 CRC 检验技术广泛应用于测控及通信领域,CRC计算可以靠专用的硬件来实现,但是对于低成本的微控制器系统,在没有硬件支持下实现CRC检验,关键的问题就是如何通过软件来完成CRC计算,也就是CRC算法的问题。CRC码是数据通信领域中最常用的一种差错检验码,其特征是信息字段和校验字段的长度可以任意选定。
实验设计要求:
C1.CRC-12 校验通信软件设计
环境要求:Windows/XP/7;C;信息交换内容为键盘输入的字符串;通信传输通过共享文件实现
编码要求:用模2 除法计算CRC 码,生成多项式为CRC-12
功能要求:能在两台计算机机上运行程序,一台产生CRC 码,另一台校验。
课程设计目标:
用C语言设计课程程序,完成用模2出发计算CRC码的CRC校验软件设计,1.掌握CRC码的计算方法;
2.掌握用C语言计算CRC码的算法;
3.熟练并掌握C语言在通信网络中的编程实现方式及功能。
CRC 简介
CRC 校验的基本思想是利用线性编码理论,在发送端根据要传送的 k 位二进制码序 列,以一定的规则产生一个校验用的监督码(既 CRC 码)r 位,并附在信息后边,构成 一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和 CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。
12位的 CRC 码产生的规则是先将要发送的二进制序列数左移 12 位(既乘以2)后,再除以一个多项式,最后所得到的余数既是 CRC 码,如式(2-1)式所示,其中 B(X)表示 n 位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既 CRC 码)。
12B(x)212R(x)(2-1)Q(x)G(x)G(x)求CRC码所采用模 2 加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,CRC-12 则产生的是 12 位的CRC码。CRC-12:G(x)xxxxx1
接收方将接收到的二进制序列数(包括信息码和 CRC 码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算 CRC 码时,接收方可以将接收到的信息码求 CRC 码,比较结果和接收到的 CRC 码是否相同。
CRC原理:
CRC码为循环冗余校验码,基本表示方式为(n,k),其中n为数据位数,k为校验码位数。CRC码校验的基本思想是利用线性编码理论,在发送端根据要传送的(n,k)位二进制码序列,121132以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。采用CRC校验时,发送方和接收方用同一个生成多项式g(x),并且g(x)的首位和最后一位的系数必须为1。CRC的处理方法是:发送方以g(x)去除t(x),得到余数作为CRC校验码。校验时,以计算的校正结果是否为0为据,判断数据帧是否出错。CRC校验可以100%地检测出所有奇数个随机错误和长度小于等于k(k为g(x)的阶数)的突发错误。所以CRC的生成多项式的阶数越高,那么误判的概率就越小。
程序流程图:
CRC-12校验方法:
多项式是0x180D,有13位,crc12本来是12位,16进制的0x80D前面补了个1,所以就是13位的。然后我们的信息是一串字符,每个字符8个位二进制,假如我们有3个字符,总共有24位。所以我们的运算就是先获取前面13位,这里的前13位二进制是指第一位是1的13位二进制。这个前13位和0x180D异或后,得到了一个异或结果,这个结果除去前面的0,应该是小于13位的。这时是不够13位的,所以我们可以在继续往后加二进制,假如3个字符,那么总共有24位进制,我们还有14到24位这些还没有加。
直到最后所有位都已经处理好了,得到的结果就是crc码。
文件共享: 将计算的数据存入共享的文件夹中,所以我们必须要先建立一个codecode的文件夹,并设为共享,将要共享的数据存在code.txt文件里。
fp_crc=fopen(“D:codecodecode.txt”,“w”);
//打开文件夹 fprintf(fp_crc,“%d ”,len+2);
//存入数据+crc的长度 for(int i=0;i fprintf(fp_crc,“%c”,ch[i]); //存入字符串 } fprintf(fp_crc,“%c”,(crcnum>>4)); //先去12位crc码的前8位 fprintf(fp_crc,“%c”,(crcnum<<4)&0xF0);//再取crc码的后4位,然后剩下的补0,使其够8位fclose(fp_crc); //最后存入文档中 另一台计算机从计算机中的共享文件夹读取数据,读出后数据进行CRC-12校验,若读出数据对生成多项式取余,若余数为0,则信息传输正确,否则信息传输错误。 fp_code=fopen(“Pc14codecodecode.txt”,“r”);//共享计算机组名为Pc14的codecode文件夹 fscanf(fp_code,“%d”,&len);//读取长度 fscanf(fp_code,“%c”,&bb);//读取长度后一个空格 for(int i=0;i fscanf(fp_code,“%c”,&data_t[i]);//按照长度读取每一个字节 fclose(fp_code); int ju=crc12(data_t,len); //crc12校验,返回 程序清单: 发送端: #include /*buf输入的信息,len信息长度*/ int crc12(uchar buf[],int len){ int wcrc;int i,iq;uchar ir;wcrc=0;///crc码 iq=0;//buf字符串下标,从0到len-1,初始化为0 ir=0;//初始化为0,0到7的变换,while(iq fprintf(fp_crc,“%c”,(crcnum<<4)&0xF0);//再取crc码的后4位,然后剩下的补0,使其够8位 fclose(fp_crc);//最后存入文档中 printf(“发送编码:%s%xn”,ch,crcnum);printf(“发送成功n”);return 0;} 接收端: #include iq=0;//字符选取下标,0-len ir=0;while(iq fscanf(fp_code,“%c”,&bb);//读取长度后一个空格 for(int i=0;i