发现服务器已开启的TCP服务.docx

上传人:b****8 文档编号:9708279 上传时间:2023-05-20 格式:DOCX 页数:10 大小:67.42KB
下载 相关 举报
发现服务器已开启的TCP服务.docx_第1页
第1页 / 共10页
发现服务器已开启的TCP服务.docx_第2页
第2页 / 共10页
发现服务器已开启的TCP服务.docx_第3页
第3页 / 共10页
发现服务器已开启的TCP服务.docx_第4页
第4页 / 共10页
发现服务器已开启的TCP服务.docx_第5页
第5页 / 共10页
发现服务器已开启的TCP服务.docx_第6页
第6页 / 共10页
发现服务器已开启的TCP服务.docx_第7页
第7页 / 共10页
发现服务器已开启的TCP服务.docx_第8页
第8页 / 共10页
发现服务器已开启的TCP服务.docx_第9页
第9页 / 共10页
发现服务器已开启的TCP服务.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

发现服务器已开启的TCP服务.docx

《发现服务器已开启的TCP服务.docx》由会员分享,可在线阅读,更多相关《发现服务器已开启的TCP服务.docx(10页珍藏版)》请在冰点文库上搜索。

发现服务器已开启的TCP服务.docx

发现服务器已开启的TCP服务

计算机网络课程设计报告

题目:

发现服务器已开启的TCP服务

学生姓名:

蒋宏国

学号:

0120149

专业班级:

芙蓉学院计算机09101班

同组姓名:

 龙番李骥邓力全

指导教师:

李若兰

设计时间:

2012年下学期第19周

指导老师意见:

 

评定成绩:

签名:

日期:

年月日

目录

一、课程设计的目的和意义…………………………………………3

二、课程设计的内容和要求……………….…………………………3

三、课程设计的相关技术……………………………………………3

四、课程设计过程……………………………………….…………3

五、课程设计小结………………………….………………………4

六.参考文献…...…………………………………………………14

一.课程设计的意义和目的

计算机网络是分布在不同地理位置的多台独立计算机系统的集合,其目的是共享计算机资源。

计算机网络环境中进程间的通信采用客户机/服务器模式。

IP地址是网络层的地址,而端口是传输层的地址,我们用IP地址和端口号来对某个网络服务进行定位。

应用IP地址,通过编程来发现服务器已开启的TCP服务。

Internet是以客户机/服务器模式进行工作的,服务器在某些端口上开起一些网络服务,等侯客户端请求的到来。

传输层提供的网络服务有TCP服务和UDP服务两种。

传输层在网络体系结构中是承下启上的以层。

可以把传输层下面的几层称作传输服务提供者(transportserviceprovider),上面的几层称着传输服务使用者(transportserviceuser)。

传输层处于中间,它既使用传输服务提供者提供的服务,又为传输服务使用者提供服务。

传输层是网络体系结构中最重要的一层,所以深入理解传输层的作用和协议,对于网络课程的学习极为关键。

通过本课程设计的目标是熟悉TCP协议和端口的概念。

二.课程设计的内容和要求

2.1课程设计要求

服务器、IP地址、端口号、TCP服务

2.2课程设计内容

编制程序发现已开启的TCP服务。

程序的具体要求如下:

(1)运行命令行:

ScanUsePortserverIP

其中,ScanUsePort是程序名;serverIP是服务器的IP地址。

(2)输出服务器正在使用的TCP端口号。

三.课程设计过程

3.1课程设计分析

(1)常用的端口扫描技术有很多,如TCPconnect扫描、TCPSYN扫描以及TCPFIN扫描等。

1)操作系统提供的connect()系统调用用来与每一个感兴趣的目标计算机的端口进行连接。

如果端口处于侦听状态,那么connect()就能连接成功。

否则,这个端口是不能使用的,即没有提供服务。

这个技术的一个最大优点是,不需要任何限制。

系统中任何用户都有权限使用这个调用。

2)如果对每个目标端口以线性方式进行扫描,即用单独的connect()调用,那么扫描速度会很慢,因此我们可以利用多个线程的并行来加快扫描速度。

3)如果对每个目标端口以线性的方式进行扫描,即用单独的connet()调用,那么扫描速度会很慢,因此我们可以利用多个线程的并发运行来加快扫描速度(即采用多线程编程)。

4)下面给出本课程设计的核心代码。

●创建原始套接字

SOCKETsock=socket(AF_INET,SOCK_STREAM,0);

●待扫描的服务器IP

Sockaddr_inseverAddr;//套接字地址变量

severAddr.sin_family=AF_INET;

severAddr.sin_port=hotons(Port);//端口地址赋值

serverAddr.sin_addr_S_un.S_adddr=severIP;//IP地址

●判断此端口是否打开

structtimevaltimeout;//超时时间

timeout.tv_sec=100/1000;

timeout.tv_usec=0;

connect(sock,(sockaddr*)&severAddr,sizeof(severAddr));//连接服务器

if(select(0,NULL,&write,NULL,&timeout)>0)

3.2课程设计流程图

开始

输入参数正确?

启动Ws2_32.dll

搜索端口结束?

N

线程数目太多?

休眠

Y

创建新线程搜索端口

YN

端口+1

休眠

还有线程未完成?

Y

N

解除与socket库绑定

结束

上图为图1——1,是主程序流程图,下图是图1——2,是主程序使用的线程流程图。

线程开始

线程数+1

创建原始套接字

设置搜索目的IP及端口

设置超时时间

端口是否打开?

N

输出端口

线程数-1

线程结束

图1——2主程序使用的线程

四.课程设计的相关技术

4.1课程设计源代码

#pragmapack(4)

#pragmacomment(lib,"Ws2_32.lib")

#include

#include

#include

#include

#include

//#include

#defineSTATUS_FAILED0xFFFF//错误码

unsignedlongserverIP;//扫描的服务器地址

longMaxThread=200;//最大允许的扫描线程

longThreadCount=0;//当前正在扫描的线程数

long*aa=&ThreadCount;

DWORDWINAPIScanPort(LPVOIDlpParam);//扫描端口的线程

voidmain(intargc,char*argv[])

{

//if(argc!

=2)//判断输入格式是否正确

//{

//cout<<"输入格式错误:

ScanUsePortserverip"<

//return;

//}

WSADATAWSAData;

if(WSAStartup(MAKEWORD(2,2),&WSAData)!

=0)//开始使用Ws-32.dll

{

cout<<"WSAStartupfaide:

"<

ExitProcess(STATUS_FAILED);

}

charstrIP[80];

cout<<"输入IP地址:

"<

cin>>strIP;

serverIP=inet_addr(strIP);

cout<<"使用中的端口号:

"<

for(inti=1;i<1024;i++)//扫描所有服务器端口

{

while(ThreadCount>=MaxThread)//超过最大允许线程数,等待

{

Sleep(10);

}

DWORDThreadID;//创建线程,扫描端口

CreateThread(NULL,0,ScanPort,(LPVOID)newshort(i),0,&ThreadID);

}

while(ThreadCount>0)//还有未完成的线程,等待

{

Sleep(50);

}

WSACleanup();//调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源

}//扫描端口的线程

DWORDWINAPIScanPort(LPVOIDlpParam)

{

shortPort=*(short*)lpParam;

InterlockedIncrement(aa);//线程数目+1

SOCKETsock=socket(AF_INET,SOCK_STREAM,0);//创建原始套接字

if(sock==INVALID_SOCKET)

{

cout<<"创建套接字失败!

"<

return0;

}

else

{

sockaddr_inseverAddr;//搜索服务器IP

severAddr.sin_family=AF_INET;

severAddr.sin_port=htons(Port);//端口地址

severAddr.sin_addr.S_un.S_addr=serverIP;//IP地址

connect(sock,(sockaddr*)&severAddr,sizeof(severAddr));

structfd_setwrite;//写socket集合 

FD_ZERO(&write);

FD_SET(sock,&write);

structtimevaltimeout;//超时

timeout.tv_sec=100/1000;

timeout.tv_usec=0;//设置超时时间

if(select(0,NULL,&write,NULL,&timeout)>0)

{

cout<

}

closesocket(sock);

}

InterlockedDecrement(aa);

return0;

}

4.2课程设计实验结果及分析

1).运行实验源代码,当输入IP地址127.0.0.1时,使用的端口好及结果如下图所示:

 

图1

输入IP地址为172.16.74.121时,程序运行结果如下图所示:

图2

2)实验结果分析:

IP地址是网络层的地址,端口是传输层的地址。

计算机使用IP地址和端口号来对某个服务器进行定位。

在实验源代码中使用系统提供函数connect(),来与每一个感兴趣的目标计算机的端口进行连接。

如果端口处于侦听状态即端口已在使用中,,那么connect()就能连接成功,否则,这个端口是不能使用的,即没有提供服务。

因此,当输入IP地址时,程序就能同过connect()函数,找出正在使用中的端口号,如实验结果所示。

五.课程设计小结

(一).在这次课程设计中,遇到了许多的困难,最后在同学的帮助下,经过多次找错后,将程序的结构理清楚,并且对程序做出修改和调试,得到想要的效果,如在VC++窗口中的“工程”选项的“设置”中,将程序变量(即IP地址)栏输入IP地址后,运行程序才得出结果。

(二).修改后的实验程序,在运行后仍然存在一些错误,如在改变输入的IP地址后,而输出显示的端口号却不变,不同的计算机使用的端口号不可能完全相同。

对与这个问题在课后通过自己反复运行,得出了输入IP地址为127.0.0.1,输出结果为图1所示的实验结果。

(三)最后,在此次课程设计期间,我们通过网上搜索资料,逛图书馆,看视屏教程了解本次课程设计的相关知识。

通过大家的努力,在同学和指导老师的帮助下,成功的完成了本次课程设计,对与他们的帮助,我们组在此表示感谢!

六.参考文献

1.《计算机网络》,第5版,谢希仁,电子工业出版社,2010.7

2.《计算机网络基础》,王寅涛、李兴元,北京理工大学出版社

3.《计算机网络基础》,袁晖,人民邮电出版社

4.《计算机网络技术》,陆瑶远,高等教育出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2