1、基于MFC的主机端口扫描程序这是第七章这是第七章这是第七章这是第七章P127.3练习题练习题练习题练习题程序具体步骤如下:1.创建一个工程运行MicrosoftVisualC+后,单击“文件”中的“新建”一个应用程序生成向导(FCAppWizardex)创建一个基于对话框的工程,该工程的“工程名称”为103140003,如下所示:单击确定,然后选择“基本对话框“,点击下一步,再在WindowsSockets前打上勾,支持Winsock编程,点击“完成”后,“确定”即可。2.设计程序对话框(1)首先把VC+自动生成的对话框中的“TOD:在这里设置对话控制”剪切掉,将“取消“按钮的“属性“中的“标
2、题“改为退出,将“确定“按钮的“属性“中的“标题“改为TCP扫描,ID改为IDTCPSAN,添加一个“按钮“,将该按钮的“属性“中的“标题“改为UP扫描,I改为IDUPSCAN,添加3个“组框“,并将其“属性“中的“标题“分别改为IP地址、端口号、扫描结果,添加3个“编辑框“并将其“属性“中的ID分别改为IDPORT1、IDPORT2、IDSTAUS,添加“静态文本框“,并将其“属性“中的“标题“分别改为From、To,添加IP地址框,并将其“属性“中的ID改为IDM_IP,添加“静态文本框“,并将其“属性“中的“标题“别改为作者信息,如图所示:(2)按Ctrl+W打开ClasWizard(类
3、向导),在Mem berVaribles中为090114073Dlg类添加4个变量,这4个变量的名称分别为m _Ip、m _Port1、m _Port2、m _Staus点击“确定”按钮。(3)在类函数OnInitDialog()中/TOD:Addextrainitializationhere下添加m _ip.setwindowtext(“127.0.0.1“)(4)在类CMy090114073Dlg中添加私有变量WSADTAWSADat、SOCKETSocket、CStringIp、intip、sockaddr_inDestHost、CStringPort:(5)在设计的对话框中分别双击TC
4、P扫描按钮和UP扫描按钮,添加类函数OnTcpscan()和OnUdpscan(),并在类函数OnTcpscan()下添加如下代码:/TOD:AdyourcontrolnotifcationhandlercodehreUpdateDat(true);if(m _Port1=“)|(m _Port2=“)MesageBox(“您没有输入正确的端口号“);return;if(atoi(m _Port1)atoi(m _Port2)MesageBox(“请将小的端口号输在前面“);return;/初始化套节口if(WSAtartup(MAKEWORD(2,),UpdateDat(false);ret
5、urn;m _Staus+=“初始化Winsock成功!rn“;/创建连接套接字Socket=socket(AF_INET,SOCK_STREAM,0);if(Socket=INVALID_SOCKET)m _Staus+=“创建Socket失败!rn“;UpdateDat(false);WSACleanup();return;m _Staus+=“创建Socket成功!rn“;/转换IP地址格式m _Ip.GetWindowText(Ip);/判断域名或IP地址ip=inet_adr(Ip);if(ip=INADR_NOE)hostent*pHostent=gethostbynam e(Ip
6、);if(pHostent)ip=(*in_adr*)pHostent-h_adr_list).S_un.S_adr;/定义目的主机地址m em st(DestHost.in_fam ily=AF_INET;DestHost.in_adr.S_un.S_adr=ip;/循环扫描套接口for(intm _Port=atoi(m _Port1);m _Portatoi(m _Port2)MesageBox(“请将小的端口号输在前面“);return;/初始化套节口if(WSAtartup(MAKEWORD(2,2),UpdateDat(false);return;m _Staus+=“初始化Win
7、sock成功!rn“;/创建连接套接字Socket=socket(AF_INET,SOCK_DGRAM,0);if(Socket=INVALID_SOCKET)m _Staus+=“创建Socket失败!rn“;UpdateDat(false);WSACleanup();return;m _Staus+=“创建Socket成功!rn“;/设置非阻塞模式intnIotrl;unsignedlongFlag=1;nIotrl=ioctlsocket(Socket,FIONBIO,if(nIotrl=SOCKET_ERR)m _Staus+=“设置Socket非阻塞模式失败!rn“;closesoc
8、ket(Socket);WSACleanup();return;/判断域名或IP地址ip=inet_addr(Ip);if(ip=INADR_NONE)hostent*pHostent=gethostbynam e(Ip);if(pHostent)ip=(*(in_addr*)pHostent-h_addr_list).S_un.S_addr;/定义目的主机地址m em st(estost.sin_fam ily=AF_INET;DestHost.sin_addr.S_un.S_addr=ip;/循环扫描套接口for(intm _Port=atoi(m _Port1);m _Port=atoi
9、(m _Port2);m _Port+)DestHost.sin_port=htons(m _Port);/转换端口号为字符串Port.Form at(“%5d“,m _Port);/定义接收缓冲区char*SendBuf;SendBuf=newchar2;m em st(SendBuf,0,2);/发送UDP数据包intnc;nc = sendto(Socket,SendBuf,1,0,(structsockaddr*)if(nc=SOCKET_EROR)m _Staus+=“UDP包发送失败!rn“;closesocket(Socket);WSACleanup();return;Slep(
10、500);/定义源主机地址sockaddr_inSourceHost;intSourceSize;SourceSize=sizeof(SourceHost);m em st(/定义接收缓冲区char*RecvBuf;RecvBuf=newchar2;m em st(RecvBuf,0,2);/接收UDP数据包intnr;nr = recvfrom(Socket,RecvBuf,1,0,(structsockaddr*)if(nr=SOCKET_EROR)/RecvFrom错误类型intErorCode=GetLastEror();if(ErorCode=10054)m _Staus+=Ip;m
11、 _Staus+=“t;m _Staus+=“UDPort:“;m _Staus+=Port;m _Staus+=“t;m _Staus+=“Closern“;if(ErorCode=10035)m _Staus+=Ip;m _Staus+=“t;m _Staus+=“UDPort:“;m _Staus+=Port;m _Staus+=“t;m _Staus+=“Openrn“;elsm _Staus+=Ip;m _Staus+=“t;m _Staus+=“TCPort:“;m _Staus+=Port;m _Staus+=“t;m _Staus+=“Openrn“;UpdateDat(false);closesocket(Socket);WSACleanup();执行结果:错误情况:(a)(b)Tcp扫描:(c)Udp扫描:(d)点退出,即可退出了。