燕山大学计算机网络程序设计报告
网络程序设计实验报告
![网络程序设计实验报告](https://img.taocdn.com/s3/m/4f17a7406d85ec3a87c24028915f804d2b168722.png)
网络程序设计实验报告实验报告:网络程序设计一、实验目的本实验主要目的是通过网络程序设计的实践,提升学生对网络编程的理解和能力。
通过完成实验,学生需要掌握以下知识和能力:1.了解网络编程的基本概念和原理;2.熟悉TCP/IP协议栈中的各个协议;3.掌握Socket编程的基本方法和使用;4.学会利用网络进行进程间通信;5.了解常用的网络编程框架和库。
二、实验环境和工具1.计算机操作系统:Windows/Linux/MacOS;2.编程语言:C/C++/Java/Python等;3.开发工具:Visual Studio/Eclipse/PyCharm等。
三、实验过程与结果1.实验过程本次实验我们选择使用C语言进行网络程序设计,采用Socket编程进行实践。
首先,我们需要了解Socket编程的基本原理和方法。
Socket编程是一种应用程序设计接口(API),用于在网络上实现进程间的通信。
我们需要创建一个套接字(Socket),并使用Socket函数进行通信的建立和数据的传输。
在实际的网络程序设计中,先创建一个Socket,然后通过bind函数将Socket绑定到一个本地的端口上。
接着,使用listen函数将Socket设为监听状态,等待客户端的连接请求。
一旦有客户端请求连接,使用accept函数接受连接请求,并获得一个新的Socket,通过新的Socket进行数据的传输。
接下来,我们可以使用send和recv函数进行数据的传输。
send函数用于将数据发送给连接的另一方,而recv函数则用于从连接的另一方接收数据。
使用send函数发送数据时,需要指定数据的大小和发送的目标地址;而接收数据时,需要指定接收数据的大小和接收数据的缓冲区。
最后,通过close函数关闭Socket,释放资源,并结束网络连接。
2.实验结果经过实验,我们成功实现了一个简单的网络通信程序。
在服务器端,我们通过创建一个Socket,并将其绑定到本地的一个端口上;然后使用listen函数将Socket设为监听状态,并等待客户端的连接请求。
windows server 2003 网络管理与应用 实验报告 燕山大学
![windows server 2003 网络管理与应用 实验报告 燕山大学](https://img.taocdn.com/s3/m/7dc65e13a8114431b90dd8d1.png)
实验一实验目的:1、了解DNS域名服务系统的工作原理;2、了解并熟悉DNS系统下区域及主机的建立;3、了解并熟悉正向查找与反向查找的工作方式;4、熟悉ping及nslookup命令;4、熟悉宿主机与虚拟机的网络连接方式与原理。
实验要求:1.在VM1的DNS服务器中建立区域(xxx是自己名字拼音首字母)。
在区域中建立两个主机host1,host2,对应的ip地址是VM1的ip地址。
2.在VM2的DNS服务器中建立区域。
在区域中建立两个主机www,ftp,对应的ip地址是VM2的ip地址。
3.分别在宿主机、VM1、VM2中ping通这几个主机:4.在VM1中建立反向查找区域,在区域中建立指向的指针。
5.在VM1中分别使用“nslookup ”和“nslookup VM1的IP”,得到正确的返回结果实验步骤及实验结果一、在VM1的DNS服务器中建立区域。
在区域中建立两个主机host1,host2,对应的ip地址是VM1的ip地址,其中VM1的IP为:192.168.0.1(1)在DNS控制台窗口中,打开“操作”菜单项选择“新建区域”命令,打开“新建区域向导”对话框。
(2)单击“下一步”按钮,打开“区域类型”对话框,在“区域类型”对话框中选择“主要区域”。
(3)单击“下一步”按钮,打开“正向或反向查找区域”对话框,在该对话框中选择“正向查找区域”。
(4)单击“下一步”按钮,打开“区域名称”对话框,在此对话框中输入。
(5)单击“下一步”按钮,打开“动态更新”对话框,指定“不允许动态更新”。
(6)单击“下一步”按钮,打开“正在完成新建区域向导”对话框,在此对话框中,单击完成,即可完成建立区域。
(7)在此区域的“正向查找区域”目录下,用鼠标右击之前建立的区域,执行快捷菜单中的“新建主机”命令。
(8)打开“新建主机”对话框,在“名称”文本框中输入host1,在“IP地址”文本框中输入VM1的IP地址,然后单击“添加主机”按钮,完成创建主机。
计算机网络课程设计实验报告
![计算机网络课程设计实验报告](https://img.taocdn.com/s3/m/f8fe516dcec789eb172ded630b1c59eef9c79a17.png)
计算机网络课程设计实验报告1. 引言计算机网络是现代信息技术的基石,它的设计与实现对于计算机科学与技术专业的学生来说尤为重要。
本次实验旨在通过一个计算机网络课程设计项目,帮助学生进一步深入理解计算机网络的原理与实践,提升实际操作能力。
2. 实验目标本实验的目标是设计一个简单的局域网内部共享文件的系统。
具体要求如下:1.实现一个服务器程序,能够提供文件的上传与下载功能;2.实现一个客户端程序,能够通过命令行界面与服务器进行交互;3.实现文件的断点续传功能,确保文件可以在网络断开后继续传输;4.实现基本的权限管理功能,确保只有授权用户才能够上传和下载文件。
3. 实验环境本次实验的开发环境与工具如下:•操作系统:Windows 10•开发语言:Python 3.8•开发环境:PyCharm 2020.1•版本控制:Git4. 实验过程与方法4.1 系统架构设计本实验的系统架构包括服务器程序和客户端程序两个部分。
服务器程序采用C/S模型,在指定端口上监听客户端的请求,根据客户端发送的指令进行相应的操作,如上传文件、下载文件、断点续传等。
服务器程序使用了Python的socket模块实现网络通信。
客户端程序通过命令行界面与服务器进行交互,用户可以输入不同的指令来实现上传、下载、断点续传等功能。
客户端程序使用了Python的argparse模块处理命令行参数,使用socket模块与服务器进行通信。
4.2 文件传输实现文件的传输采用TCP协议进行,对于较大的文件,可以采用分片传输的方式,确保文件能够在网络断开后继续传输。
客户端程序在向服务器请求下载文件时,会先发送文件的元信息(如文件名、大小等),服务器会根据元信息判断文件是否存在、是否需要断点续传等。
对于需要断点续传的文件,服务器会记录已传输的字节数,并将剩余部分发送给客户端。
4.3 权限管理实现服务器程序实现了基本的权限管理功能,通过在服务器端维护一个用户列表,每次上传或下载文件时,都会要求用户进行身份验证。
燕山大学多核程序设计实验报告
![燕山大学多核程序设计实验报告](https://img.taocdn.com/s3/m/55da5cfdfab069dc502201be.png)
实验一Windows多线程编程一、实验目的与要求了解windows多线程编程机制掌握线程同步的方法二、实验环境和软件Windows XPVC 6.0三、实验内容1.创建线程:HANDLE CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);2.线程的挂起与恢复DWORD SuspendThread(HANDLE hThread);DWORD ResumeThread(HANDLE hThread);3.线程终结BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);四、实验步骤这个程序首先创建两个线程,当输入为1时,执行线程,否则挂起线程。
#include <windows.h>#include <iostream>using namespace std;DWORD WINAPI FunOne(LPVOID param){while(true){Sleep(1000);cout<<"hello! ";}return 0;}DWORD WINAPI FunTwo(LPVOID param){while(true){Sleep(1000);cout<<"world! ";}return 0;}int main(int argc, char* argv[]){int input=0;HANDLE hand1=CreateThread (NULL, 0, FunOne, (void*)&input, CREATE_SUSPENDED, NULL);HANDLE hand2=CreateThread (NULL, 0, FunTwo, (void*)&input, CREATE_SUSPENDED, NULL);while(true){cin>>input;if(input==1){ResumeThread(hand1);ResumeThread(hand2);}else{SuspendThread(hand1);SuspendThread(hand2);}};TerminateThread(hand1,1);TerminateThread(hand2,1);return 0;}:实验结果:实验二蒙特卡罗法求PI一、实验目的和要求蒙特卡洛算法可理解为通过大量实验,模拟实际行为,来收集统计数据。
燕山大学软件工程课程设计报告完整版
![燕山大学软件工程课程设计报告完整版](https://img.taocdn.com/s3/m/fea59e716137ee06eef91864.png)
燕山大学软件工程课程设计报告HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】燕山大学软件工程课程设计说明书题目:网上书店学院(系):信息科学与工程学院年级专业:10级计算机应用三班学号:学生姓名:方小雨学号:学生姓名:王嘉恺指导教师:邓成玉教师职称:教授燕山大学课程设计(论文)任务书2013年6 月21 日燕山大学课程设计评审日第一章绪论课题背景在网络信息日益发展的今天,网络已经成为人们日常生活的一部分。
网上购物也成为现代社会的趋势和潮流。
而随着互联网的飞速发展以及我国经济的稳步平衡增长,人们对于精神文明也愈加看重,对于知识的追求也却来越高。
因而图书市场开始繁荣起来。
但由于各种各样的原因使得消费者在选购图书时不能迅速找到合意的书籍。
近年来网上书店也在网络经济的刺激下开始发力,各类资本纷纷注入这一充满潜力的新型市场。
由于网上书店图书种类包罗万象,且价格比传统书店便宜不少,以至于越来越多的消费者青睐于网上购书。
1999年,国内真正意义上第一家网上书店——当当网上线。
北京大学社会学专业毕业、从国家机关辞职下海的李国庆,拿着第一笔风险投资的基金开始了自己的网店生涯。
8年后,这家号称全球最大中文网上书店的企业营业额已经达到8个亿。
此后,伴随着世界电子商务浪潮的到来,越来越多的网上书店在国内兴起。
课题目的消费者都想在最短的时间内购买到自己所需的图书。
但现有大型电商平台音像书籍分类下书目繁多,给人们在繁忙的工作生活中购书带来了很大的麻烦,于是如何方便快捷的购买到自己所需的图书就成了人们较为关心的问题。
本小组成员经过网上查询资料和实地调查发现,燕山大学附近只有3家传统书店且规模较小。
稍微上点规模的城市之光也因为盗版原因存在着质量问题,价格也比京东等大型电商高出两成左右。
而大型网上书店虽然品种杂多,但缺少高等院校适用的教材,在快递方面最快也要一天才可到达学校。
网络程序设计实训报告(广播程序设计)
![网络程序设计实训报告(广播程序设计)](https://img.taocdn.com/s3/m/6c1e6665fe4733687e21aa29.png)
XXXX大学实习(实训)报告名称实用网络程序设计实训XX年X月X日至XX年X月X日共一周院系计算机工程系班级XXXXXXX姓名XXXX系主任XXXX教研室主任XXXXX指导教师X X X X X X X X XXXXXX 大学实习(实训)任务书名称:实用网络程序设计实训起讫时间:XXXXXXXXXXXXXX院系:计算机工程系班级:XXXXXXX指导教师:XXXXXXXXXX系主任:XXXXX广播程序设计4.1 设计分析与原理网络会议室与聊天室程序类似,其本质就是一种多点群发的的通信方式。
在电子教室软件的实际应用过程中,经常需要组织分小组进行讨论,这时就需要建立几个组群,每个组内可以发起讨论,交流意见,这就是网络会议室应用程序。
本章的网络会议室功能虽与上一章的聊天室类似,但采用的是一种更好的实现方法——IP多播技术。
网络会议室需要有以下主要功能:用户可以选择参加某个会议用户可以在会议上发表言论,并且用户的发言会即时传递给每个参加会议的人用户可以随时看到参加会议的其他人的发言用户可以随时选择退出会议。
需要时,还可以再加入进来。
界面设计:关键技术分析:根据参与一次通信的对象的多少,可将通信分为两大类:一类是点对点通信,也称其为单播通信,TCP协议仅支持这种单播通信方式一类是多点通信,也称为群或组通信,UDP协议既支持单播通信方式,又支持多点通信方式。
广播通信:所谓广播是指一种同时与网络中所有主机进行交互数据的通信方式,传输者通过一次数据传输就可以使网络上的所有主机接收到这个数据信息。
广播通信的主要用途是资源发现和减少网络数据流量。
用于指示网络中所有主机的地址称为广播地址。
广播地址有直接地址和有限地址之分。
直接广定网络(已知网络号)发送数据包的情况,若不知道网络号,又要向本地网络发送广播数据包,就需要使用有限广播地址255.255.255.255 。
核心程序——IP广播:一个IP广播程序分成两个部分,一个是广播端,一个是接收端。
燕山大学.net程序设计实验报告
![燕山大学.net程序设计实验报告](https://img.taocdn.com/s3/m/b04da1de76eeaeaad1f330b8.png)
燕山大学.Net程序设计实验报告学院 : 信息科学与工程学院年级专业 : 11级**** : ***学生学号 : **************** : ***提交日期 : 2014年5月24日实验一制作一张课程表一.实验要求:熟悉HTML的基本语法,了解其中各组件的使用。
二、目的原理:在html中运用表格的方法建立一张课程表。
三、实验内容及代码为:<table width="622" height="277" border="1"><tr><td width="97"> </td><td width="97">星期一</td><td width="97">星期二</td><td width="97">星期三</td><td width="97">星期四</td><td width="97">星期五</td></tr><tr><td height="53">1.2</td><td>汇编</td><td>专英</td><td>汇编</td><td>嵌入式</td><td>网络</td></tr><tr><td>3.4</td><td>专英</td><td>嵌入式</td><td>嵌入式</td><td>软件</td><td> </td></tr><tr><td>5.6</td><td>网络</td><td> </td><td>信息管理</td><td> </td><td>专英</td></tr><tr><td>7.8</td><td> </td><td>信息管理</td><td> </td><td> </td><td> </td></tr></table>3.实验截图如下:实验二统计在线人数一.实验要求:掌握控件加事件的开发方法及一般步骤;会使用Form、label、TextBox、CheckBox、Button的基本控件掌握Request、Response的使用。
张祚网络课设
![张祚网络课设](https://img.taocdn.com/s3/m/82ead72e482fb4daa58d4bb8.png)
燕山大学课程设计报告虚拟机的配置及虚拟机上个人主页的设计学院信息科学与工程学院年级专业11级计算机应用3班学生姓名张祚指导教师提交日期2014.6.27燕山大学课程设计报告摘要本次课程设计在windows 7平台上,安装虚拟机,在虚拟机上安装windows server作为服务器,安装两个windows xp作为工作站。
配置连接两个主机和服务器之间的连接,能够做到在主机上的IE浏览器能够浏览在服务器端建设的简单的个人网站。
本报告首先说明了在服务器上配置WWW服务的过程,添加ISS和DNS,配置网络号和域名号以及使服务器和客户端可以通信的过程。
接着介绍了个人网页的设计过程,及源代码。
关键词:建设网站,windows server,html,个人网页,子网掩码域名解析,windows xp目录摘要 (I)第1章绪论 (1)1.1课题背景 (1)1.2 选题依据..................................................... 错误!未定义书签。
1.3 课题目的 (1)第2章设置服务器和工作站 (2)2.1建立可通信的服务器和工作站 22.2 在服务器短配置WWW服务 32.21安装IIS 6.0 32.22新建网站. 82.23安装DNS (8)第3章个人网站的设计 (22)3.1网页源代码163.2 网页效果21 结论 (27)参考文献 (28)第1章绪论1.1 课题背景在当前这个信息化发展如此迅速的时代,人们已经越来越离不开网络了,网络给人们的生活带来了巨大的改变和提高,就在今天这样的网络流行的时代,作为大学生的计算机专业的我们必须要掌握一些关于网络建设和配置的基本知识,并能够建立一些简单的网络,能通过一些主机来访问简单的服务器,并能够制作一些简单的html网页,在网页上能完成一些基本的动作跳转和表格表单。
1.2 课题意义1.有助于加深我们对网络课程这门课的理解,在课堂上学的都是基础理论,对于如何用程序语言来描述所学的知识还是有一定的难度的,通过课设能够真正理解其内涵。
计算机网络实验报告完整高质量打印版
![计算机网络实验报告完整高质量打印版](https://img.taocdn.com/s3/m/1fa551285acfa1c7ab00cc47.png)
2011年3 月实验1 基本网络命令实验目的1.了解网络命令的基本功能2.掌握基本网络命令的使用方法3.掌握使用网络命令观察网络状态的方法实验环境1.软件环境:Microsoft Windows 2000、三台或六台一组,每组要有指定的服务器2.硬件环境:配置网卡的计算机,由IP路由器连接。
实验步骤1.安装TCP/IP。
2.手动配置TCP/IP参数。
3.使用ipconfig命令来测试TCP/IP是否安装成功。
4.使用ping命令来验证。
5.学习tracert、netstat、arp、net等命令的功能及使用方法。
命令Ipconfig命令可以用来显示本机当前的TCP/IP配置信息。
这些信息一般用来验证TCP/IP设置是否正确。
常用格式:(1)当使用Ipconfig是不带任何参数选项,那么它为每个已经配置好的接口显示IP地址、子网掩码和默认网关值。
注:这是在虚拟机win xp上的测试(2)Ipconfig/all。
当使用all选项时,Ipconfig除了显示已配置TCP/IP信息外,还显示内置于本地网卡中的物理地址(MAC)以及主机名等信息。
(3)Ipconfig/release和Ipconfig/renew。
这是两个附加选项,只能在DHCP(动态主机配置协议)服务器租用IP地址的计算机上起作用。
2. Ping命令Ping命令的格式如下:Ping [-t] [-a] [-n count] [-l size] [-f] [-I TTL] [-v TOS] [-r count] [-s count] [[-jhost-list]|[-k host-list]] [-w timeout] destination-listPing命令主要参数如下:-t:使当前主机不断地向目的主机发送数据,直到按Ctrl+C键中断。
-a:将地址解析为计算机名。
-n count:发送count 指定的ECHO数据包数,默认值为4 。
燕山大学操作系统课程设计报告说明书
![燕山大学操作系统课程设计报告说明书](https://img.taocdn.com/s3/m/d5d872b4ad02de80d5d84072.png)
燕山大学课程设计说明书课程设计名称:操作系统题目:多道程序缓冲区协调操作〔模拟生产者消费者问题〕课题负责人:学院:信息科学与工程学院班级::学号:课题开发日期:2021年1月13日自评成绩: A目录1概述--------------------------------------------------------------------------------------31.1 目的--------------------------------------------------------31.2 主要完成的任务----------------------------------------------31.3 使用的开发工具、开发语言------------------------------------31.4 本软件解决的主要问题---------------------------------------42 设计的根本理念、概念和原理------------------------------------------------42.1 设计的根本理念----------------------------------------------42.2 根本概念----------------------------------------------------42.3 根本原理----------------------------------------------------53 总体设计----------------------------------------------------53.1根本的技术路线:面向对象--------------------------------------------------------53.2模块关系及总体流程-------------------------------------------54 详细设计----------------------------------------------------74.1 变量设计----------------------------------------------------74.2 线程的设计--------------------------------------------------74.3 button按钮的设计-------------------------------------------85编码设计----------------------------------------------------95.1开发环境----------------------------------------------------95.2考前须知----------------------------------------------------95.3主要代码设计------------------------------------------------9PUTTER线程的设计---------------------------------------------------9MOVER1线程的设计---------------------------------------------------10GETTER1线程的设计--------------------------------------------------11“开场〞按钮的设计--------------------------------------------------12“完毕〞按钮的设计--------------------------------------------------145.4解决的主要难题----------------------------------------------166测试出现的问题及其解决方案-------------------------------167工程总结----------------------------------------------------168参考文献----------------------------------------------------16多道程序缓冲区协调操作演示程序设计说明书1概述1.1目的计算机操作系统是计算机系统中最不可缺少的,最常用的软件,也是核心的,最接近于计算机硬件的软件。
燕山大学软件工程课程设计报告
![燕山大学软件工程课程设计报告](https://img.taocdn.com/s3/m/4385ee4b866fb84ae55c8d49.png)
燕山大学软件工程课程设计说明书题目: _____________ 网上书店 ____________ 学院(系):信息科学与工程学院年级专业:10级计算机应用三班学号: ___________________学生姓名:方小雨学号:学生姓名:王嘉恺指导教师:邓成玉教师职称:教授燕山大学课程设计(论文)任务书2013 年6 月21 日燕山大学课程设计评审2013 月21 第一章绪论.....................................1.1课题背景..................................1.2课题目的..................................1.3任务与具体要求.............................1.4开发环境..................................1.5小组内部分工...............................第二章可行性分析..................................2.1经济可行性................................2.2技术可行性................................2.3操作可行性................................2.4法律可行性................................第三章需求分析....................................3.1系统需求分析................................3.1.1用户(前台)功能 .......................3.1.2管理员(后台)功能 .....................3.2数据流程分析................................3.3业务流程分析...............................3.4用例图分析...............................3.4.1管理者用例 ...........................3.4.2客户用例图 ...........................3.5数据字典..................................第四章概要设计....................................4.1模块设计..................................4.1.1前台功能分模块设计.4.1.2后台功能分模块设计.4.2系统功能结构设计 ..........4.2.1系统结构设计的原则.4.2.2系统安全性设计 .....4.2.3系统的保密性设计4.3数据库设计..................4.3.1数据库概念结构设计4.3.2数据库逻辑结构设计4.3.3数据库物理结构设计第五章详细设计....................................5.1前台功能分模块详细设计 ...........................5.2后台功能分模块详细设计 ...........................第六章心得体会....................................第七章参考资料....................................第一章绪论1.1课题背景在网络信息日益发展的今天,网络已经成为人们日常生活的一部分。
燕山大学 C++面向对象程序设计实验报告
![燕山大学 C++面向对象程序设计实验报告](https://img.taocdn.com/s3/m/b0bcce01eff9aef8941e0697.png)
C++面向对象程序设计实验报告C++ Programming Experiment Report学生所在学院:学生所在班级:学生姓名:____________学号:指导教师:教务处2012年5 月一、程序源代码:#include "iostream"#include "string"using namespace std;class Node{private:char *data;public:Node *prior;Node *next;Node &operator=(Node &b);//解决指针悬挂Node(){data=NULL;prior=NULL;next=NULL;}Node(string datain);Node(const Node &p);~Node();char *&getdata();};Node &Node::operator=(Node &b){if(data) delete[]data;if(b.data){data=new char [strlen(b.data)+1];strcpy(data,b.data);}else data=0;return *this;}Node::Node(string datain){int i;i=datain.length();data=new char[i+1];datain.copy(data,i);data[i]='\0';prior=NULL;next=NULL;}Node::Node(const Node &p){data=new char [strlen(p.data)+1];strcpy(data,p.data);prior=NULL;next=NULL;}Node::~Node(){next=NULL;prior=NULL;delete []data;}//析构函数char *&Node::getdata(){return data;}class List{protected:Node *pHead;Node *pTail;public:List();~List();List(const List &p);int InList();char *GetHead();Node *&GetHeadPos();char *GetTail();Node *&GetTailPos();char *RemoveHead();char *RemoveTail();int AddHead(string s);int AddHead(List b);int AddTail(string s);int AddTail(Node p);int AddTail(List b);int RemoveAll();int InsertBefore();int InsertAfter();char *GetAt(int m);void SetAt(int m);Node *RemoveAt(int m);Node *Find(string s);Node *FindIndex(int x);int GetCount();bool IsEmpty();int Print();int List::PrintH();int List::PrintT();};class Stack:public List{public:int Push(string s){Node *p;if(!pHead){pHead=new Node(s);}else{p=new Node(s);p->next=pHead;pHead=p;}return 0;}int Pop(char *&e){Node *p=pHead;if(!pHead){cout<<"空栈"<<endl;return 1;}pHead=pHead->next;p->next=NULL;e=p->getdata();return 0;}};class Queue:public List{public:int EnQueue(string s){if(!pHead){pHead=new Node(s);pTail=pHead;return 0;}else{pTail->next=new Node(s);pTail=pTail->next;}return 0;}int DeQueue(char *&e){Node *p=pHead;if(!pHead){cout<<"空表"<<endl;return 1;}pHead=pHead->next;p->next=NULL;e=p->getdata();return 0;}};class Set:public List{public:Set();Set(const Set &p);};Set::Set(){pHead=NULL;pTail=NULL;}Set::Set(const Set &p){Node *q=p.pHead;Node *r;if(!p.pHead)pTail=pHead=NULL;else{r=new Node;*r=*p.pHead;pHead=r;pHead->next=NULL;pHead->prior=NULL;q=q->next;while(q){r->next=new Node;*r->next=*q;r->next->prior=r;r=r->next;if(!q->next)pTail=r;q=q->next;}}}Set operator-(Set a,Set b){Node *p,*q,*r;Set c;c=Set(a);q=b.GetHeadPos();while(q){p=c.GetHeadPos();while(strcmp(q->getdata(),p->getdata())){p=p->next;if(!p)break;}if(p){if(p==c.GetHeadPos()) c.RemoveHead();else if(p==c.GetTailPos()) c.RemoveTail();else{r=p;p->prior->next=p->next;p->next->prior=p->prior;p->prior=NULL;p=p->next;r->next=NULL;delete r;}}q=q->next;}return c;}Set operator+(Set a,Set b){Node *p,*q;Set c;c=Set(a);q=b.GetHeadPos();while(q){p=c.GetHeadPos();while(strcmp(q->getdata(),p->getdata())){p=p->next;if(!p)break;}if(!p)c.AddTail(*q);q=q->next;}return c;}Set And(Set a,Set b){Node *p,*q;Set c;q=b.GetHeadPos();while(q){p=a.GetHeadPos();while(strcmp(q->getdata(),p->getdata())){p=p->next;if(!p)break;}if(p){c.AddTail(*p);}q=q->next;}return c;}List::List(){pHead=NULL;pTail=NULL;}//构造函数List::List(const List &p){Node *q=p.pHead;Node *r;if(!p.pHead)pTail=pHead=NULL;else{r=new Node;*r=*p.pHead;pHead=r;pHead->next=NULL;pHead->prior=NULL;q=q->next;while(q){r->next=new Node;*r->next=*q;r->next->prior=r;r=r->next;if(!q->next)pTail=r;q=q->next;}}}List::~List(){}int List::InList(){int num,i=1;string s;Node *p;cout<<"请输入要入链表元素的数目"<<endl;cin>>num;if(0==num) return 0;else{cout<<"请输入第"<<i<<"个元素"<<endl;cin>>s;pHead=new Node(s);pTail=pHead;p=pHead;while(i!=num){i++;cout<<"请输入第"<<i<<"个元素"<<endl;cin>>s;p->next=new Node(s);p->next->prior=p;p->next->next=NULL;p=p->next;}pTail=p;return 0;}}char *List::GetHead(){return pHead->getdata();}Node *&List::GetHeadPos(){return pHead;}char *List::GetTail(){return pTail->getdata();}Node *&List::GetTailPos(){return pTail;}char *List::RemoveHead(){Node *p;p=pHead;pHead=pHead->next;pHead->prior=NULL;return p->getdata();}char *List::RemoveTail(){Node *p;p=pTail;pTail=pTail->prior;pTail->next=NULL;return p->getdata();}int List::AddHead(string s){if(!pHead){pHead=new Node(s);pTail=pHead;}else{pHead->prior=new Node(s);pHead->prior->next=pHead;pHead=pHead->prior;pHead->prior=NULL;}return 0;}int List::AddHead(List b){if(!pHead){pHead=b.pHead;pTail=b.pTail;}else{b.pTail->next=pHead;pHead->prior=b.pTail;pHead=b.pHead;}return 0;}int List::AddTail(string s){if(!pHead){pHead=new Node(s);pTail=pHead;}else{pTail->next=new Node(s);pTail->next->prior=pTail;pTail=pTail->next;pTail->next=NULL;}return 0;}int List::AddTail(Node p){if(!pHead){pHead=new Node;*pHead=p;pHead->next=NULL;pHead->prior=NULL;pTail=pHead;}else{pTail->next=new Node;*pTail->next=Node(p);pTail->next->prior=pTail;pTail=pTail->next;pTail->next=NULL;}return 0;}int List::AddTail(List b){if(!pHead){pHead=b.pHead;pTail=b.pTail;}else{pTail->next=b.pHead;b.pHead->prior=pTail;pTail=b.pTail;}return 0;}int List::RemoveAll(){Node *p=pHead,*q;pHead=pTail=NULL;//p->prior=NULL;while(p){q=p;p=p->next;q->~Node();}return 0;}int List::InsertBefore(){Node *p;int i=1,a;string s;p=pHead;cout<<"请输入要插入元素的位置"<<endl;cin>>a;cout<<"请输入要插入的字符串"<<endl;cin>>s;if(a==1){if(!pHead){pHead=new Node(s);pTail=pHead;}else{p=new Node(s);p->next=pHead;pHead->prior=p;pHead=p;}return 0;}while(i!=a&&p){p=p->next;i++;}p->prior->next=new Node(s);p->prior->next->next=p;p->prior->next->prior=p->prior;p->prior=p->prior->next;return 0;}//InsertBefore 在给定位置之前插入int List::InsertAfter(){Node *p;int i=1,a;string s;p=pHead;cout<<"请输入要插入元素的位置"<<endl;cin>>a;cout<<"请输入要插入的字符串"<<endl;cin>>s;if(0==a){if(!pHead){pHead=new Node(s);pTail=pHead;}else{p=new Node(s);p->next=pHead;pHead->prior=p;pHead=p;}return 0;}while(i!=a){p=p->next;i++;}if(!p->next){p->next=new Node(s);p->next->prior=p;p->next->next=NULL;pTail=p->next;}else{p->next->prior=new Node(s);p->next->prior->next=p->next;p->next=p->next->prior;p->next->prior=p;}return 0;}//InsertAfter在给定位置之后插入char *List::GetAt(int m){if(m<0){cout<<"错误的输入"<<endl;exit(0);}int i=1;Node *p;p=pHead;while(i!=m&&p){p=p->next;i++;}if(i<m){cout<<"超出范围"<<endl;exit(0);}return p->getdata();}void List::SetAt(int m){int i=0;Node *p;string s;p=pHead;while(i!=m&&p){p=p->next;i++;}if(i<m){cout<<"错误的输入"<<endl;exit(0);}cout<<"请输入新元素的值"<<endl;cin>>s;int j;j=s.length();p->getdata()=new char[j+1];s.copy(p->getdata(),j);p->getdata()[j]='\0';}//SetAt m=0为头结点所处位置Node *List::RemoveAt(int m){int i=0;Node *p;string s;p=pHead;while(i!=m&&p){p=p->next;i++;}if(i<m){cout<<"错误的输入"<<endl;exit(0);}if(p==pHead) RemoveHead();else if(p==pTail) RemoveTail();else{p->prior->next=p->next;p->next->prior=p->prior;p->prior=NULL;p->next=NULL;}return p;}Node *List::Find(string s){Node *p=pHead;int l;l=s.length();while(pare(0,l,p->getdata())){p=p->next;if(!p){cout<<"没有找到与输入字符串相等的数据"<<endl;return NULL;}}return p;}Node *List::FindIndex(int x){if(x<-1){cout<<"错误的位置输入"<<endl;return NULL;}Node *p=pHead;int i=0;while(i!=x&&p){p=p->next;i++;}if(!p){cout<<"输入位置超出链表范围"<<endl;return NULL;}return p;}int List::GetCount(){Node *p=pHead;int l=0;while(p){p=p->next;l++;}return l;}bool List::IsEmpty(){if(!pHead) {cout<<"空表"<<endl;return 1;}else {cout<<"链表非空"<<endl;return 0;}}int List::Print(){Node *p;p=pHead;if(!p){cout<<"空表";return -1;}do{cout<<p->getdata()<<" ";p=p->next;}while(p!=NULL);cout<<endl;return 0;}//输出所有数据char *GetNext(Node *&p){if(!p->next){Node *q=p;p=NULL;return q->getdata();}else{p=p->next;return p->prior->getdata();}}//GetNextchar *GetPrev(Node *&p){if(!p->prior){Node *q=p;p=NULL;return q->getdata();}else{p=p->prior;return p->next->getdata();}}//GetPrevint List::PrintH(){Node *p;p=pHead;if(!p){cout<<"空表"<<endl;return -1;}while(p) cout<<GetNext(p)<<" ";cout<<endl;return 0;}int List::PrintT(){Node *p;p=pTail;if(!p){cout<<"空表"<<endl;return -1;}while(p) cout<<GetPrev(p)<<" ";cout<<endl;return 0;}List operator+(List a,List b){a.GetTailPos()->next=b.GetHeadPos();b.GetHeadPos()->prior=a.GetTailPos();a.GetTailPos()=b.GetTailPos();return a;}int main(){List a;int i,m,n,pos;string s;do{cout<<" 请输入要进行的操作"<<endl;cout<<"1:添加节点"<<endl;cout<<"2:输出节点"<<endl;cout<<"3:查询节点"<<endl;cout<<"4:修改节点"<<endl;cout<<"5:删除节点"<<endl;cout<<"0:结束"<<endl;cin>>m;switch(m){case 1:{cout<<"1:为空表输入多个节点"<<endl;cout<<"2:添加一个头结点"<<endl;cout<<"3:把另一个链表添加到头结点位置"<<endl;cout<<"4:添加一个尾节点"<<endl;cout<<"5:把另一个链表添加到尾结点位置"<<endl;cout<<"6:在某个位置之前插入节点"<<endl;cout<<"7:在某个位置之后插入节点"<<endl;do{cout<<"请选择添加节点的方式,返回上一层请输入0"<<endl;cin>>n;switch(n){case 1:{a.InList();a.PrintH();break;}case 2:{cin>>s;a.AddHead(s);a.PrintH();break;}case 3:{cout<<"请输入被添加的链表的数据"<<endl;List b;b.InList();a.AddHead(b);cout<<"添加完毕";a.PrintH();break;}case 4:{cin>>s;a.AddTail(s);a.PrintH();break;}case 5:{cout<<"请输入被添加的链表的数据"<<endl;List b;b.InList();a.AddTail(b);cout<<"添加完毕";a.PrintH();break;}case 6:{a.InsertBefore();a.PrintH();break;}case 7:{a.InsertAfter();a.PrintH();break;}case 0:{n=0;break;}default: cout<<"指令错误请重新输入"<<endl;}}while(n!=0);break;}//case1case 2:{cout<<"1:从头到尾输出"<<endl;cout<<"2:从尾到头输出"<<endl;cout<<"3:输出头结点"<<endl;cout<<"4:输出尾节点"<<endl;do{cout<<"请选择输出节点的方式,返回上一层请输入0"<<endl;cin>>n;switch(n){case 1: a.PrintH();break;case 2: a.PrintT();break;case 3: cout<<a.GetHead()<<endl;break;case 4: cout<<a.GetTail()<<endl;break;case 0: n=0;break;default:cout<<"输入错误请重新输入"<<endl;}}while(n!=0);break;}//case2case 3:{cout<<"1:输入字符串查找"<<endl;cout<<"2:输入位置查找"<<endl;cout<<"3:查询表长"<<endl;cout<<"4:查看表是否为空"<<endl;do{cout<<"请输入要进行的操作,返回上一层请输入0"<<endl;cin>>n;switch(n){case 1:cout<<"请输入一个字符串"<<endl;cin>>s;cout<<a.Find(s)->getdata()<<endl;break;case 2:cout<<"请输入一个位置(头结点为0)"<<endl;cin>>pos;cout<<a.FindIndex(pos)->getdata()<<endl;break;case 3:cout<<a.GetCount()<<endl;break;case 4:cout<<a.IsEmpty();break;case 0:n=0;break;default:cout<<"输入错误请重新输入"<<endl;}}while(n!=0);break;}//case 3case 4: cout<<"请输入要修改元素的位置"<<endl;cin>>pos;a.SetAt(pos);a.PrintH();break; //case4case 5:{cout<<"1:删除头结点"<<endl;cout<<"2:删除尾节点"<<endl;cout<<"3:删除指定位置元素"<<endl;cout<<"4:删除所有节点"<<endl;do{cout<<"请选择删除的方式,返回上一层请输入0"<<endl;cin>>n;switch(n){case 1:a.RemoveHead();a.PrintH();break;case 2:a.RemoveTail();a.PrintH();break;case 3:cout<<"请输入一个位置"<<endl;cin>>pos;a.RemoveAt(pos);a.PrintH();break;case 4:a.RemoveAll();a.RemoveAll();a.PrintH();break;case 0:n=0;break;default:cout<<"输入错误请重新输入"<<endl;}}while(n!=0);break;}//case5case 0:m=0;break;default:cout<<"输入错误请重新输入"<<endl;}//switch(m)}while(m!=0);Stack st;int l=0;char *e;cout<<"请输入栈的长度"<<endl;cin>>l;for(i=1;i<=l;i++){cout<<"请输入入栈元素"<<endl;cin>>s;st.Push(s);}st.Print();cout<<"栈顶元素出栈:"<<endl;st.Pop(e);cout<<e<<endl;Queue qu;cout<<"请输入队列的长度"<<endl;cin>>l;for(i=1;i<=l;i++){cout<<"请输入入队列元素"<<endl;cin>>s;qu.EnQueue(s);}qu.Print();cout<<"元素出队列"<<endl;qu.DeQueue(e);cout<<e<<endl;Set a1,b,c;cout<<"请输入集合A"<<endl;a1.InList();cout<<"请输入集合B"<<endl;b.InList();c=a1-b;cout<<"集合的差:";c.Print();c=a1+b;cout<<"集合的并:";c.Print();c=And(a1,b);cout<<"集合的交:";c.Print();return 0;}二、实验结果:封面设计:贾丽地址:中国河北省秦皇岛市河北大街438号邮编:066004电话:************传真:************网址:。
网络程序设计报告
![网络程序设计报告](https://img.taocdn.com/s3/m/798fb69b59f5f61fb7360b4c2e3f5727a5e92490.png)
网络程序设计报告网络程序设计是一个涉及多个方面的复杂领域,它要求开发者不仅要有扎实的编程基础,还要对网络通信原理有深入的理解。
本报告将从网络程序设计的基本概念、设计原则、常见技术、以及实际应用案例等方面进行详细阐述。
一、网络程序设计概述网络程序设计是指利用编程语言和网络通信协议,开发能够在网络环境中运行的软件系统。
这种设计通常涉及到客户端和服务器之间的数据交换,以及数据的封装、传输和解析。
二、网络通信基础在进行网络程序设计之前,理解网络通信的基本原理是至关重要的。
这包括:- TCP/IP协议栈:网络通信的基础,包括网络层、传输层、应用层等。
- HTTP/HTTPS协议:超文本传输协议,用于Web浏览器和服务器之间的通信。
- WebSocket:一种在单个TCP连接上进行全双工通信的协议。
- FTP/SFTP:文件传输协议,用于文件的上传和下载。
三、设计原则网络程序设计应遵循以下原则:- 模块化:将程序分解为独立的模块,便于管理和维护。
- 可扩展性:设计时应考虑未来可能的需求变化,使系统易于扩展。
- 安全性:确保数据传输的安全性,防止数据泄露和未授权访问。
- 性能优化:优化算法和资源使用,提高程序的响应速度和处理能力。
四、开发技术网络程序设计涉及到多种开发技术,包括:- 编程语言:如Java、Python、C#等,每种语言都有其特定的网络库和框架。
- 网络框架:例如Node.js、、Django等,它们提供了丰富的网络开发功能。
- 数据库交互:通过网络程序与数据库进行交互,存储和检索数据。
- API设计:设计RESTful API或GraphQL API,以支持前后端分离的开发模式。
五、安全性考虑网络安全是网络程序设计中不可或缺的一部分,包括:- 数据加密:使用SSL/TLS等技术对数据进行加密,保护数据传输过程中的安全。
- 身份验证和授权:确保只有授权用户才能访问特定的资源。
- 防止SQL注入和XSS攻击:通过输入验证和输出编码来防止这些常见的网络攻击。
燕山大学计算机网络课程设计报告1
![燕山大学计算机网络课程设计报告1](https://img.taocdn.com/s3/m/b7bbd97ab94ae45c3b3567ec102de2bd9605de90.png)
燕⼭⼤学计算机⽹络课程设计报告1燕⼭⼤学课程设计报告设计题⽬:虚拟机的配置及虚拟机上个⼈主页的设计学院信息科学与⼯程学院年级专业2010级计算机应⽤2班学⽣姓名赵秉志学号100104010057指导教师⾦顺福王世明课程名称《计算机⽹络原理》提交⽇期2013年7⽉12⽇摘要本次课程设计在Windows 7 平台上,以VMware Workstation为⼯具,Microsoft IIS 6.0和FileZilla为服务器⼯具,进⾏虚拟机的配置及虚拟机上个⼈主页的设计。
实现建⽴⼀台服务器⼀或两台⼯作站的虚拟机⽹络,配置服务器的WWW服务设置,在服务器上设计个⼈主页。
通过⼯作站浏览个⼈主页。
本报告中⾸先说明了该设计的课程设计⽬的,之后详细说明了课程设计内容,重点介绍了服务器各项功能的具体实现。
该设计功能完善、运⾏稳定,可完成⽹页的发布以及通过⼯作站浏览个⼈主页。
关键词计算机⽹络;VMware Workstation;Microsoft IIS 6.0;FileZilla⽬录⼀、课程设计⽬的 (2)⼆、课程设计内容 (2)三、设计步骤 (2)1.安装虚拟机 (2)2. 在虚拟机平台上建⽴可⽹络通讯的服务器和⼯作站 (2)3.在服务器上配置WWW服务 (3)4.⼯作站与服务器之间的互联 (4)5. 配置DNS服务器通过域名访问相应的⽹站 (5)四、设计结果 (6)1.WWW服务器测试 (6)2.DNS服务器测试 (6)五、⼼得体会 (7)附录参考⽂献 (8)⼀、课程设计⽬的建⽴⼀台服务器⼀或两台⼯作站的虚拟机⽹络,配置服务器的WWW服务设置,在服务器上设计个⼈主页。
通过⼯作站浏览个⼈主页。
⼆、课程设计内容1.安装虚拟机,在虚拟机平台上建⽴可⽹络通讯的服务器和⼯作站。
2.在服务器上配置WWW服务。
3.在服务器上设计⼀个简单的个⼈主页。
4.在⼯作站上浏览个⼈主页。
5.在服务器上配置DNS服务器。
三、设计步骤1.安装虚拟机⾸先安装虚拟机,然后在虚拟机上安装Windows Server 2003作为服务器,安装⼀个Windows Xp作为PC⼯作站1.2. 在虚拟机平台上建⽴可⽹络通讯的服务器和⼯作站依次安装Windows Server 2003、Windows Xp⼀台虚拟机,如下图所⽰。
燕山大学数字通信计算机仿真课程设计报告模板
![燕山大学数字通信计算机仿真课程设计报告模板](https://img.taocdn.com/s3/m/c8b81174cc7931b764ce1523.png)
□⑵窗函数法■①确定理想频率响应理想低通滤波誥的传输虧数丹j为”网问<Q)C0 伦叱Q M JFK M用应的单位取样响应叭n为其中截I上频率❻------------------ -----------------------------□400J—— -------- pz1000 1400珅忠低迪滤波器理俎带通滤波器带通滤波器:「\胡(%(”-"))一血(引⑺一①)其中截止频率%二2打竺,四“强列Z Z—匕1,滤波器长度N需要先设定.2岂■②加窗h()i] = h(H)-5rj»).截取其中一段,可以是各种窗函数押⑺卜其中截止频率伦二2JT*£□载波产生x(/?)=4'Cos 2zr/+fliA/-其中M二1//,刃二omb N为基带倍号总点数(左匸8000血N=640h A为常数…如果基带信号用血)来表示…丸如N调制过程为!咆二咖・卅),加(U2…儿□卷积工(灯)=x( n)x(n): OJ,—-?Zj _ i ah( n) \0丄…;一1”m ) = h(>n\x\ n tn)m—o? nt—«H: 0,…,妇+£j - Lm: 0,1,…,厶—1,n w) = 0 * 当并■ M c 0或打JW A厶+ £2* Ivoid convolotion{ float xfM],float h[127] afloat y[Ml)j»l 1;Hoiit blfiwni; 1=M+N;for(i=0 ;i<l;i++)(bl[i1=4j0;funj=(l;J<NJ++)bl[11=bl{i]+4:elsebl[ll+=hDMHhfor(i=0;i<M:i++>y[i]=hlfi+(X-]^2h口噪声陶匀分布白噪声和高斯分布白嗓声rand()产生个隧机数,范国为DORLAND MAX-则尸=(T.®严)严心严e[-MJ•如舉产生七为n的序列•世*:服从詢勻分布,由吒数宦律可知:独立问分布的葩机娈呈相加服从高斷分布。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.基础知识1.1原始套接字创建面向连接的TCP和创建面向无连接的UDP套接字,在接收和发送时只能操作数据部分,而不能对IP首部或TCP和UDP首部进行操作如果想要操作IP首部或传输层协议首部,就需要调用如下socket()函数创建网络层原始套接字。
协议栈的原始套接字从实现上可以分为“链路层原始套接字”和“网络层原始套接字”两大类链路层原始套接字链路层原始套接字调用socket()函数创建。
第一个参数指定协议族类型为PF_PACKET,第二个参数type可以设置为SOCK_RAW或SOCK_DGRAM,第三个参数是协议类型(该参数只对报文接收有意义)。
1.socket(PF_PACKET, type, htons(protocol))参数type设置为SOCK_RAW时,套接字接收和发送的数据都是从MAC首部开始的。
在发送时需要由调用者从MAC首部开始构造和封装报文数据网络层原始套接字socktet(PF_INET, SOCK_RAW, protocol)//接收到的数据网络层原始套接字接收到的报文数据是从IP首部开始的,即接收到的数据包含了IP首部, TCP/UDP/ICMP等首部, 以及数据部分。
//发送的数据网络层原始套接字发送的报文数据,在默认情况下是从IP首部之后开始的,即需要由调用者自行构造和封装TCP/UDP等协议首部这种套接字也提供了发送时从IP首部开始构造数据的功能,通过setsockopt()给套接字设置上IP_HDRINCL选项,就需要在发送时自行构造IP首部。
1.intval = 1;2.setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, &val, sizeof(val));1.2一些函数socket()函数socket函数是一种可用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源的函数。
创建原始套接字:原始套接字的创建:int socket ( int family, int type, int protocol );参数:family:协议族这里写PF_PACKETtype:套接字类,这里写SOCK_RAWprotocol:协议类别,指定可以接收或发送的数据包类型,不能写“0”,取值如下,注意,传参时需要用htons() 进行字节序转换。
ETH_P_IP:IPV4数据包ETH_P_ARP:ARP数据包ETH_P_ALL:任何协议类型的数据包返回值:成功( >0 ):套接字,这里为链路层的套接字失败( <0 ):出错实例如下:// 所需头文件#include <sys/socket.h>#include <netinet/ether.h>#include <stdio.h> // perrorint main(int argc, char *argv[]){int sock_raw_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) );if(sock_raw_fd < 0){perror("socket");return -1;}return 0;}sendto()函数intsendto ( socket s , const void * msg, intlen, unsigned int flags, conststructsockaddr * to , inttolen ) ;sendto() 用来将数据由指定的socket传给对方主机。
参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。
参数msg指向欲连线的数据内容,参数flags 一般设0,。
参数to用来指定欲传送的网络地址,参数tolen为sockaddr的结构长度。
recvfrom()函数本函数用于从(已连接)套接口上接收数据,并捕获数据发送源的地址。
函数原型:intrecvfrom(sockets,void *buf,intlen,unsignedint flags, structsockaddr *from,int *fromlen);是一个阻塞函数函数说明:recv()用来接收远程主机经指定的socket传来的数据,并把数据传到由参数buf指向的内存空间,参数len为可接收数据的最大长度.参数flags一般设0,参数from用来指定欲传送的网络地址,参数fromlen为sockaddr的结构长度.inet_addr()函数功能:字符串转地址声明:in_addr_tinet_addr(const char *cp);in_addr_t一般为32位的unsigned int,其字节顺序为网络顺序(network byte ordered),即该无符号整数采用大端字节序htonl()函数将主机数转换成无符号长整形的网络字节顺序。
inet_ntoa()char *inet_ntoa (struct in_addr);返回点分十进制的字符串在静态内存中的指针。
alarm()函数#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <signal.h>void sig_alarm(){exit(0); //到时间后就退出.}int main(int argc, char *argv[]){signal(SIGALRM, sig_alarm);alarm(10);sleep(15);printf("Hello World!\n");return 0;}1.3使用原始套接字时应该注意的问题(1):对于UDP/TCP产生的IP数据包,内核不将它传递给任何原始套接字,而只是将这些数据交给对应的UDP/TCP数据处理句柄(所以,如果你想要通过原始套接字来访问TCP/UDP或者其它类型的数据,调用socket函数创建原始套接字第三个参数应该指定为htons(ETH_P_IP),也就是通过直接访问数据链路层来实现.(我们后面的密码窃取器就是基于这种类型的).(2):对于ICMP和EGP等使用IP数据包承载数据但又在传输层之下的协议类型的IP数据包,内核不管是否已经有注册了的句柄来处理这些数据,都会将这些IP数据包复制一份传递给协议类型匹配的原始套接字.(3):对于不能识别协议类型的数据包,内核进行必要的校验,然后会查看是否有类型匹配的原始套接字负责处理这些数据,如果有的话,就会将这些IP数据包复制一份传递给匹配的原始套接字,否则,内核将会丢弃这个IP数据包,并返回一个ICMP 主机不可达的消息给源主机.(4): 如果原始套接字bind绑定了一个地址,核心只将目的地址为本机IP地址的数包传递给原始套接字,如果某个原始套接字没有bind地址,核心就会把收到的所有IP数据包发给这个原始套接字.(5): 如果原始套接字调用了connect函数,则核心只将源地址为connect连接的IP 地址的IP数据包传递给这个原始套接字.(6):如果原始套接字没有调用bind和connect函数,则核心会将所有协议匹配的IP 数据包传递给这个原始套接字.2).编程选项原始套接字是直接使用IP协议的非面向连接的套接字,在这个套接字上可以调用bind和connect函数进行地址绑定.说明如下:(1)bind函数:调用bind函数后,发送数据包的源IP地址将是bind函数指定的地址。
如是不调用bind,则内核将以发送接口的主IP地址填充IP头. 如果使用setsockopt设置了IP_HDRINCL(header including)选项,就必须手工填充每个要发送的数据包的源IP地址,否则,内核将自动创建IP首部.(2)connect函数:调用connect函数后,就可以使用write和send函数来发送数据包,而且内核将会用这个绑定的地址填充IP数据包的目的IP地址,否则的话,则应使用sendto或sendmsg函数来发送数据包,并且要在函数参数中指定对方的IP地址。
ICMP报文IPCMP报文分为两种:一是错误报告报文,二是查询报文。
注意:每个ICMP报头均包含类型、编码、校验和这三项内容,长度为:8位、8位、16位。
其余选项则随ICMP的功能不同而不同。
ping命令只使用众多ICMP报文中的两种:"请求(ICMP_ECHO)"和"回应(ICMP_ECHOREPLY)"。
在定义:structicmp{u_int8_t icmp_type; /* type of message, see below */u_int8_t icmp_code; /* type sub code */u_int16_t icmp_cksum; /* ones complement checksum of struct */}协议头校验和算法网际校验和算法,把被校验的数据16位进行累加,然后取反码,若数据字节长度为奇数,则数据尾部补一个字节的0以凑成偶数。
unsigned short chksum(addr,len)unsigned short *addr; // 校验数据开始地址(注意是以2字节为单位)intlen; // 校验数据的长度大小,以字节为单位{int sum = 0; // 校验和intnleft = len; // 未累加的数据长度unsigned short *p; // 走动的临时指针,2字节为单位unsigned short tmp = 0; // 奇数字节长度时用到while( nleft> 1){sum += *p++; // 累加nleft -= 2;}// 奇数字节长度if(nleft == 1){// 将最后字节压如2字节的高位*(unsigned char *)&tmp = *(unsigned char *)p;sum += tmp;}//高位低位相加sum = (sum >> 16) + (sum & 0xffff);// 上一步溢出时(十六进制相加进位),将溢出位也加到sum中sum += sum >> 16;// 注意类型转换,现在的校验和为16位tmp = ~sum;return tmp;}2.设计思路2.1我们可以根据输入的参数中的IP地址和子网掩码得到这个网段中的所有IP地址.2.2得到IP地址后向这台主机发送类型码为0的ICMP回送请求消息给目的主机。