实验三端口扫描.docx
《实验三端口扫描.docx》由会员分享,可在线阅读,更多相关《实验三端口扫描.docx(10页珍藏版)》请在冰点文库上搜索。
实验三端口扫描
实验三、端口扫描
1、实验目的与要求
◆掌握网络编程模式。
◆理解并能应用socket来扫描端口号
2、实验设备与环境
连网PC机(至少一台)。
计算机硬件要求:
英特尔酷睿i53代系列处理器、256MB以上内存,Ethernet网卡,网线若干。
计算机软件要求:
Windows7操作系统,Visualc++6.0/.net系统。
3、实验要求
能够以可视化的形式显示主机面
能够实现TCP端口的扫描
能够实现UDP端口的扫描
4、实验内容与步骤:
步骤1:
使用VC++的应用程序生成向导(MFCAppWizard[exe])创建一个基于对话框的工程,该工程的名称为201200824302PortScan
步骤2:
设计主界面:
同时在类向导里面添加需要的变量:
步骤3:
添加事件
3.1添加响应“TCP扫描”按钮的事件:
voidCMy201200824302PortScanDlg:
:
OnTcp()
{
UpdateData(true);
WSADATAWSAData;
CStringstr;
if(WSAStartup(0x0202,&WSAData)!
=0)
{
MessageBox("初始化Winsock失败!
");
}
soc=socket(AF_INET,SOCK_STREAM,0);
if(soc==INVALID_SOCKET)
{
MessageBox("创建socket失败!
");
WSACleanup();
return;
}
intIpAddress;
inti=0;
CStrings;
m_ip.GetWindowText(s);
IpAddress=inet_addr(s);
if(IpAddress==INADDR_NONE)
{
hostent*pHostent=gethostbyname(str);
if(pHostent)
IpAddress=(*(in_addr*)pHostent->h_addr).s_addr;
}
if(m_port1>m_port2)
{
MessageBox("请确保起始端口号不大于终止端口号!
");
WSACleanup();
return;
}
structsockaddr_indesthost;
memset(&desthost,0,sizeof(desthost));
desthost.sin_family=AF_INET;
desthost.sin_addr.s_addr=IpAddress;
for(unsignedinta=m_port1;a{
desthost.sin_port=htons(a);
char*SendBuf;
SendBuf=newchar[2];
memset(SendBuf,0,2);
intnConnect=connect(soc,(sockaddr*)&desthost,sizeof(desthost));
if(nConnect==SOCKET_ERROR)
{
str.Format("%d",a);
m_static+="TCPPort";
m_static+=str;
m_static+=":
Close\r";
m_static+="\n";
}
else
{str.Format("%d",a);
m_static+="TCPPort";
m_static+=str;
m_static+=":
Open\r\n";
m_static+="\n";
}
}
UpdateData(false);
closesocket(soc);
WSACleanup();
}
3.2添加响应“UDP扫描”按钮的事件:
voidCMy201200824302PortScanDlg:
:
OnUdp()
{
UpdateData(true);
WSADATAWSAData;
CStringstr;
if(WSAStartup(0x0202,&WSAData)!
=0)
{
MessageBox("初始化Winsock失败!
");
}
soc=socket(AF_INET,SOCK_STREAM,0);
if(soc==INVALID_SOCKET)
{
MessageBox("创建socket失败!
");
WSACleanup();
return;
}
intnIotr1;//设置阻塞模式
unsignedlongflag=1;
nIotr1=ioctlsocket(soc,FIONBIO,&flag);
if(nIotr1==SOCKET_ERROR)
{
MessageBox("创建socketM模式失败!
");
closesocket(soc);
WSACleanup();
return;
}
intIpAddress;//判断域名或IP地址
inti=0;
CStrings;
m_ip.GetWindowText(s);
IpAddress=inet_addr(s);
if(IpAddress==INADDR_NONE)
{
hostent*pHostent=gethostbyname(str);
if(pHostent)
IpAddress=(*(in_addr*)pHostent->h_addr).s_addr;
}
structsockaddr_indesthost;
memset(&desthost,0,sizeof(desthost));
desthost.sin_family=AF_INET;
desthost.sin_addr.s_addr=IpAddress;
for(unsignedinta=m_port1;a{
desthost.sin_port=htons(a);
char*SendBuf;
SendBuf=newchar[2];
memset(SendBuf,0,2);
intnsend=sendto(soc,SendBuf,1,0,(structsockaddr*)&desthost,sizeof(desthost));
if(nsend==SOCKET_ERROR)
{
MessageBox("UDP包发送失败!
");
closesocket(soc);
WSACleanup();
return;
}
Sleep(500);
sockaddr_inSourceHost;//定义源主机地址
intSourceSize;
SourceSize=sizeof(SourceHost);
memset(&SourceHost,0,SourceSize);
char*RecvBuf;
RecvBuf=newchar[2];
memset(RecvBuf,0,2);
intnRecv;
nRecv=recvfrom(soc,RecvBuf,1,0,(structsockaddr*)&SourceHost,&SourceSize);
if(nRecv==SOCKET_ERROR)
{
intErrorCode=GetLastError();
if(ErrorCode==10054)
{
str.Format("%d",a);
m_static+="UDPPort";
m_static+="str";
m_static+=":
Close\r\n";
}
else
{
m_static+="UDPPort";
m_static+=a;
m_static+=":
Open\r\n";
}
}
}
UpdateData(false);
closesocket(soc);
WSACleanup();
}
5、实验结果
主界面显示:
测试1:
验证起始端口不可以大于终止端口
测试2:
TCP端口扫描
测试3:
UDP端口扫描失败
测试3:
UDP端口扫描
验证运行结果:
6、实验总结
通过本次试验我了解了使用Socket套接字对端口进行的扫描。
进一步对TCP和UDP协议进行了学习。
让我对网络编程产生了浓厚的兴趣!