服务器已开启的TCP服务Word文档下载推荐.docx
《服务器已开启的TCP服务Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《服务器已开启的TCP服务Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
IP地址是网络层的地址,而端口是传输层的地址,我们用IP地址和端口号来对某个网络服务进行定位。
应用IP地址,通过编程来发现服务器已开启的TCP服务。
二.课程设计关键字
服务器、IP地址、端口号、TCP服务
三.课程设计目的
Internet是以客户机/服务器模式进行工作的,服务器在某些端口上开起一些网络服务,等侯客户端请求的到来。
传输层提供的网络服务有TCP服务和UDP服务两种。
传输层在网络体系结构中是承下启上的以层。
可以把传输层下面的几层称作传输服务提供者(transportserviceprovider),上面的几层称着传输服务使用者(transportserviceuser)。
传输层处于中间,它既使用传输服务提供者提供的服务,又为传输服务使用者提供服务。
传输层是网络体系结构中最重要的一层,所以深入理解传输层的作用和协议,对于网络课程的学习极为关键。
通过本课程设计的目标是熟悉TCP协议和端口的概念。
四.课程设计方法
编制程序发现已开启的TCP服务。
程序的具体要求如下:
(1)运行命令行:
ScanUsePortserverIP
其中,ScanUsePort是程序名;
serverIP是服务器的IP地址。
(2)输出服务器正在使用的TCP端口号。
五.课程设计分析
(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)
六.课程设计流程图
开始
输入参数正确?
搜索端口结束?
线程数目太多?
创建新线程搜索端口
端口+1
还有线程未完成?
解除线程与socket库绑定
结束
休眠
启动Ws_32.dll
上图为图1——1,是主程序流程图,下图是图1——2,是主程序使用的线程流程图。
线程开始
创建原始套接字
设置搜索目的的IP及端口
设置超时时间
输出端口
线程数—1
线程结束
端口是否打开?
线程数+1
图1——2主程序使用的线程
七.课程设计源代码
#pragmapack(4)
#pragmacomment(lib,"
Ws2_32.lib"
)
#include<
stdio.h>
winsock2.h>
ws2tcpip.h>
stdlib.h>
iostream.h>
//#include<
string.h>
#defineSTATUS_FAILED0xFFFF//错误码
unsignedlongserverIP;
//扫描的服务器地址
longMaxThread=200;
//最大允许的扫描线程
longThreadCount=0;
//当前正在扫描的线程数
long*aa=&
ThreadCount;
DWORDWINAPIScanPort(LPVOIDlpParam);
//扫描端口的线程
voidmain(intargc,char*argv[])
{
//if(argc!
=2)//判断输入格式是否正确
//{
//cout<
<
"
输入格式错误:
ScanUsePortserverip"
endl;
//return;
//}
WSADATAWSAData;
if(WSAStartup(MAKEWORD(2,2),&
WSAData)!
=0)//开始使用Ws-32.dll
{
cout<
WSAStartupfaide:
GetLastError()<
ExitProcess(STATUS_FAILED);
}
charstrIP[80];
cout<
输入IP地址:
cin>
>
strIP;
serverIP=inet_addr(strIP);
使用中的端口号:
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)
创建套接字失败!
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,&
structtimevaltimeout;
//超时
timeout.tv_sec=100/1000;
timeout.tv_usec=0;
//设置超时时间
if(select(0,NULL,&
write,NULL,&
0)
cout<
Port<
closesocket(sock);
InterlockedDecrement(aa);
return0;
}
八.课程设计实验结果及分析
1).运行实验源代码,当输入IP地址127.0.0.1时,使用的端口好及结果如下图所示:
图1
输入IP地址为172.16.74.121时,程序运行结果如下图所示:
图2
2)实验结果分析:
IP地址是网络层的地址,端口是传输层的地址。
计算机使用IP地址和端口号来对某个服务器进行定位。
在实验源代码中使用系统提供函数connect(),来与每一个感兴趣的目标计算机的端口进行连接。
如果端口处于侦听状态即端口已在使用中,,那么connect()就能连接成功,否则,这个端口是不能使用的,即没有提供服务。
因此,当输入IP地址时,程序就能同过connect()函数,找出正在使用中的端口号,如实验结果所示。
九.课程设计总结
(一).在这次课程设计中,遇到了许多的困难,但同学和老师的帮助下,还是顺利完成了。
在实验过程中,开始调试实验程序时,由于实验程序的缘故,输出结果不是:
输入格式出错:
ScanUsePortserverip
Pressanykeytocontinue
就是:
最后在同学的帮助下,结果多次找错后,在VC++窗口中的“工程”选项的“设置”中,将程序变量(即IP地址)栏输入IP地址后,运行程序才得出结果。
最后对实验程序进行修改后,变为现在的实验程序,实验通过实验者输入任一IP地址后,运行结果显示该IP地址的计算机正在使用的端口号。
如当输入IP地址为:
172.16.74.121时,实验运行结果如图2所示。
(二).修改后的实验程序在运行时也出现了一点小的问题,就是在改变输入的IP地址后,而输出显示的端口号却不变,这就有问题了,不同的计算机使用的端口号不可能完全相同。
对与这个问题在课后通过自己反复运行,得出了输入IP地址为127.0.0.1,输出结果为图1所示的实验结果。
(三).通过此次课程设计,学到了不少的东西,在此期间,我们通过网上搜索资料,逛图书馆,看视屏教程了解本次课程设计的相关知识,真的使人受益匪浅,收获颇多!
通过大家的努力,在同学和指导老师的帮助下,成功的完成了本次课程设计,对与他们的帮助,我们组在此表示感谢!
十.参考文献
1.《计算机网络》,第5版,谢希仁,电子工业出版社,2010.7
2.《计算机网络基础》,王寅涛、李兴元,北京理工大学出版社
3.《计算机网络基础》,袁晖,人民邮电出版社
4.《计算机网络技术》,陆瑶远,高等教育出版社