计算机网络课程设计报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“计算机网络课程设计”。
目录
需求分析…………………………………………….3
总体设计…………………………………………….3
详细设计…………………………………………….4
测试的步骤………………………………………….4
编 码………………………………………………...6
测试的内容…………………………………………14
课程设计总结………………………………………14 参考资料……………………………………………14
需求分析:
随着信息化科学技术的快速发展,21世纪的人们将步入一个前所未有信息时代。计算机技术和网络技术将深入地影响到人们社会生活的各个领域。各种网络资源成为现代社会不可或缺的一部分。无论是对教育、医疗,乃至军事、社会生活的方方面面都有着深刻的影响。Internet的飞速发展带来的众多有价值的信息共享,使互联网越来越被广大用户所接受,进而在全球迅速蔓延。现代社会中,无论你从事的是什么行业,在互联网中都可以找到你想要的有用资源。某种意义上讲,互联网已经深入影响到了社会生活的每个角落,给人们的生活带来了全新的感受。很多的网络活动已经成为了一种时尚。同时,人类社会的诸多方面对网络的依赖程度越来越强。一个崭新的“网络时代”正在急速向现代社会走来。
但是网络在提供便利的共享资源的同时也带来了各种各样的安全风险。因此,网络安全问题越来越引起人们的广泛关注,并成为当今网络技术研究的重点。通常黑客和病毒是通过安全漏洞渗入目标系统的,因此只要找到并修补所有的安全漏洞,就可以抵御绝大部分的黑客攻击。安全漏洞扫描技术能够检测网络系统潜在的安全漏洞,使网络管理者可以预先了解网络的脆弱性所在,从而确保网络系统的安全。
通常,一次成功的网络攻击,首先要收集目标计算机IP地址,然后才能进一步对目标实施有针对性的有效攻击。而对目标计算机IP地址的获取,目前主要是通过网络端口扫描工具实现的。
课程设计目的加深对TCP/IP的理解,熟悉socket编程。
课程设计内容
实现一个扫描器,使用TCP connect进行端口扫描,并把扫描到的结果记录下来。
课程设计要求
(1)Windows或Linux环境下,程序在单机上运行;(2)使用端口扫描对一台主机进行扫描,并显示出结果;对一个网段进行IP扫描,显示出结果;
(3)提供友好的用户界面。
总体设计:利用已学的C语言知识,结合在上网络课上所学专业知识,设计并开发出一个端口扫描程序,判断指定的主机有哪些端口可以提供服务, 并把扫描得知的结果记录下来。能让工作人员清楚的看出该台主机上那个IP端口可以使用,那个IP端口有多少个端口可以被使用,详细设计:
1.先输入想要扫描的网段;
2.然后将输入的网段转化为可排序的IP数组
3.建立多个线程,每个线程扫描一个IP。每个线程内先建立数据流套接字,然后绑定 IP端口进行扫描。将扫描端口保存到g_map_ScanResult。
4.清理结束后进程,输出结果。
5.计算所用时间。
测试的步骤:
在Windows系统下,在Microsoft Visual C++ 6.0的环境下,设计程序代码,开发一个可以测试主机IP地址的实用型小软件。
编码完成后正常的运行后,会弹出一个对话框。我们只需按照对话框中所提示的输入规格的IP地址,那么则可以检测出这台主机IP地址的使用情况
即输入开始IP地址以及结束IP地址即可开始扫描
扫描的结果中除了有几个IP地址之外还会有那几个IP地址可用的端口。如下图所示:
编码:#pragma comment(lib,“ws2_32.lib”)#pragma warning(disable:4786)#include #include #include #include #include #include #include #include //#include “IpScan.h” using namespace std;//全局变量: //待扫描的端口 const short g_portsTOscan[]= {20,21,22,23,25,42,43,47,53,63,67,68,79,80,95,106,107,109,110,113,135,137,138,139,143,144,161,162,443,445,1024,1080,1433,1434,1755,3306,4000,5010,5190,5631,5632,8000,8080 };const short PORTSNUM = sizeof(g_portsTOscan)/ sizeof(short);//端口个数 //等扫描的IP vector g_vec_IpToScan;string g_startIp;string g_endIp;//开启的线程数,目前为1个IP1个线程 long g_runThreadNum;
//socket相关
TIMEVAL
g_timeout;
//阻塞等待时间
//FD_SET
g_mask;
//socket模式设置,储存socket信息 const short TIMEOUT = 1;
//阻塞等待时间
WSADATA
g_wsadata;
//socket版本信息
//线程中的互斥体
HANDLE g_PortMutex;
HANDLE g_ThreadNumMutex;
HANDLE g_ResultMutex;
//输入结果的互斥量
//保存IP扫描的结果
multimap g_map_ScanResult;
//----------------------//线程函数,扫描每一个IP DWORD WINAPI ThreadFunc(LPVOID th_para){
//获取需要扫描的IP
//char *pStrIp =(char*)th_para;
unsigned long ulScanIp = *(unsigned long*)th_para;
int index = 0;
//端口索引
SOCKET link_sock;
//SOCKET
FD_SET
set_flag;
//SOCKET描述
short select_ret;
//select异步返回值
short port;
//正在扫描的端口
while(index
{
port = g_portsTOscan[index];
//创建数据流套接字
link_sock = socket(AF_INET, SOCK_STREAM, 0);
if(link_sock == INVALID_SOCKET)
{
//cout
WaitForSingleObject(g_ThreadNumMutex,INFINITE);
g_runThreadNum--;
ReleaseMutex(g_ThreadNumMutex);
//cout
return-1;
}
FD_ZERO(&set_flag);
//将指定文件描述符清空
FD_SET(link_sock,&set_flag);//用于在文件描述符集合中增加一个新的文件描述符
//设置连接地址
SOCKADDR_IN scan_addr;
scan_addr.sin_family = AF_INET;
scan_addr.sin_addr.s_addr = ulScanIp;
scan_addr.sin_port = htons(port);
unsigned long sock_set = 1;
ioctlsocket(link_sock,FIONBIO,&sock_set);
//设置套接字为非阻塞模式,第3个参数非0为非阻塞
connect(link_sock,(struct sockaddr *)&scan_addr, sizeof(scan_addr));//连接指定IP端口
select_ret = select(0,NULL,&set_flag,NULL,&g_timeout);//异步返回值
if(select_ret == 0 || select_ret ==-1)
{
++index;
continue;
}
else
{
strstream stream_result;
struct in_addr ipaddr;
ipaddr.s_addr = ulScanIp;
char *pStrIp = inet_ntoa(ipaddr);
stream_result
string str_result(stream_result.str());
//将扫描结果储存到输出变量中去
WaitForSingleObject(g_ResultMutex,INFINITE);
g_map_ScanResult.insert(make_pair(ulScanIp,str_result));
ReleaseMutex(g_ResultMutex);
}
++index;
}
//扫描完一个线程
shutdown(link_sock, 0);
closesocket(link_sock);
WaitForSingleObject(g_ThreadNumMutex,INFINITE);
g_runThreadNum--;
ReleaseMutex(g_ThreadNumMutex);
//cout
return 0;}
//-------------//将IP转化成能直接递增和递减的地址
unsigned long InvertIp(unsigned long srcIp)
{
unsigned char first;
unsigned char second;
unsigned char third;
unsigned char fourth;
first
=
srcIp
&
0x00FF;
second
=
(srcIp
>>
8)
&
0x00FF;
third
=
(srcIp
>>
16)
&
0x00FF;
fourth
=
(srcIp
>>
24)
&
0x00FF;
return
(first
}
//---//将IP内的IP转化成一个一个unsigned long 类型存在数组中
int GetIpToScan(const string &StartIp, const string &EndIp, vector &vec_ip){
//判断输入的IP是否合法
unsigned long ulStartIp = inet_addr(StartIp.c_str());
unsigned long ulEndIp = inet_addr(EndIp.c_str());
if(INADDR_NONE == ulStartIp
||
INADDR_NONE == ulEndIp)
{
cout
return-1;
}
//////////////判断查询的是一个IP还是IP段/////////////////////////////////////
if(ulStartIp == ulEndIp && ulStartIp!=0)
{
vec_ip.push_back(ulStartIp);
return 0;
}
if(ulStartIp == 0 && ulEndIp == 0)
{
return 0;
}
if(ulStartIp == 0)
{
vec_ip.push_back(ulEndIp);
return 0;
}
if(ulEndIp == 0)
{
vec_ip.push_back(ulStartIp);
return 0;
}
////////////////////////////////////////////////////////////////////////////
//将IP转换成可以递增比较的类型
ulStartIp = InvertIp(ulStartIp);
ulEndIp = InvertIp(ulEndIp);
//指定前后顺序,ulEndIp较大
unsigned long max_ip;
if(ulStartIp > ulEndIp)
{
max_ip = ulStartIp;
ulStartIp = ulEndIp;
ulEndIp = max_ip;
}
int ipnums = ulEndIpstart_time)/ CLOCKS_PER_SEC;
cout
return 0;} 测试内容:即根据对话框的提示输入符合标准的IP地址即可,最后得出的结果是扫描的几个IP地址中各自有几个可用的端口。
设计总结:
通过这次端口扫描器的实验深化了信息对抗,信息安全的意识。对于网络端口扫描器有了整体上的认识。了解了socket函数的基本用法和端口扫描的基本原理。在这次设计中在处理线程上遇到了很大麻烦,不过通过上网查找和书本,基本解决,还有就是刚开始在socket的运用上很是不懂,经过上网查找也顺利解决。而且在此次试验中又复习了以前学习的C语言,巩固了C语言知识。总之这次设计,不仅是对以前只是的巩固,也学习到了许多新知识。
参考资料:
C语言程序设计 计算机网络
资料来源:百度文库
道客巴巴
计算机网络课程设计报告题目:简单企业网的设计与实现 专业:计算机应用技术 姓名:黄贤菊 班级:1340301 学号:201340030119 指导老师:魏树权完成时间:2015年6月25日1 目录一、···......
计算机网络 课程设计报告班 级:指导教师:学 号:姓 名: 信息管理与信息系统1201摘要: ............................................................................................
《计算机网络》课程设计 姓 名赵世友专 业网络工程 班 级 学 号网133 139074357 李沁 指导教师安徽工业大学计算机学院2016.6.12计算机网络课程设计-#+DATE: * 概要与需......
xxxxx Normal University of Science & Technology计算机网络 课程设计报告班 级: 学 号: 姓 名xxxxx Normal University of Science & Technology 大纲一.课程设计的目的及要......
计算机网络课程设计姓名:学号: 班级:完成时间:2015.12.5 1.课程设计要求: 1.PCA至PCD五台PC机属于不同网络,且要划分VLAN 2.PCA能ping通所有PC机,PCC不能ping通PCE 3.PCA属于内网地......