《计算机网络技术教程-自顶向下分析与设计方法》源代码_第1页
《计算机网络技术教程-自顶向下分析与设计方法》源代码_第2页
《计算机网络技术教程-自顶向下分析与设计方法》源代码_第3页
《计算机网络技术教程-自顶向下分析与设计方法》源代码_第4页
《计算机网络技术教程-自顶向下分析与设计方法》源代码_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章FTP客户机程序设计//FtpClientDlg.h:headerfile#defineMAX_SIZE4096classCFtpClientDlg:publicCDialog{public: //{{AFX_DATA(CFtpClientDlg) enum{IDD=IDD_FTPCLIENT_DIALOG}; CString m_Address; CString m_Account; CString m_Password; CString m_Directory; CString m_Login; //}}AFX_DATAprotected: //{{AFX_MSG(CFtpClientDlg) afx_msgvoidOnList(); afx_msgvoidOnQuit(); afx_msgvoidOnConnect(); //}}AFX_MSGprivate: boolDataConnect(); boolSendCommand(); boolRecvRespond(); charCommand[MAX_SIZE]; charRespond[MAX_SIZE]; intRespondCode; SOCKETSocketControl; SOCKETSocketData;};//FtpClientDlg.cpp:implementationfile#include"stdafx.h"#include"FtpClient.h"#include"FtpClientDlg.h"#include"winsock.h"voidCFtpClientDlg::OnConnect(){ WSADATAWSAData; if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)//建立套接字绑定 { MessageBox("初始化Winsock失败!"); return; } SocketControl=socket(AF_INET,SOCK_STREAM,0);//创建连接套接字 if(SocketControl==INVALID_SOCKET) { MessageBox("创建控制Socket失败!"); WSACleanup(); return; } intIpAddress;//判断域名或IP地址 IpAddress=inet_addr(m_Address); if(IpAddress==INADDR_NONE) { hostent*pHostent=gethostbyname(m_Address); if(pHostent) IpAddress=(*(in_addr*)pHostent->h_addr).s_addr; } sockaddr_inserveraddr;//定义套接字地址 memset(&serveraddr,0,sizeof(serveraddr)); serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(21); serveraddr.sin_addr.s_addr=IpAddress; m_Login+="Client:Connectto"; m_Login+=m_Address; m_Login+="...\r\n"; intnConnect; nConnect=connect(SocketControl,(sockaddr*)&serveraddr,sizeof(serveraddr)); if(nConnect==SOCKET_ERROR)//建立FTP控制连接 { MessageBox("控制连接建立失败!"); closesocket(SocketControl); WSACleanup(); return; } if(!RecvRespond()) return; else { if(RespondCode==220)//判断连接应答码 { m_Login+="Server:"; m_Login+=Respond; } else { MessageBox("控制连接响应错误!"); closesocket(SocketControl); WSACleanup(); return; } } memset(Command,0,MAX_SIZE); memcpy(Command,"USER",strlen("USER"));//合成USER命令 memcpy(Command+strlen("USER"),m_Account,strlen(m_Account)); memcpy(Command+strlen("USER")+strlen(m_Account),"\r\n",2); if(!SendCommand())//发送USER命令 return; m_Login+="Client:"; m_Login+=Command; if(!RecvRespond()) return; else { if(RespondCode==220||RespondCode==331)//判断USER应答码 { m_Login+="Server:"; m_Login+=Respond; } else { MessageBox("USER响应错误!"); closesocket(SocketControl); WSACleanup(); return; } } if(RespondCode==331) { memset(Command,0,MAX_SIZE);//合成PASS命令 memcpy(Command,"PASS",strlen("PASS")); memcpy(Command+strlen("PASS"),m_Password,strlen(m_Password)); memcpy(Command+strlen("PASS")+strlen(m_Password),"\r\n",2); if(!SendCommand())//发送PASS命令 return; m_Login+="Client:PASS******\r\n"; if(!RecvRespond()) return; else { if(RespondCode==230)//判断PASS应答码 { m_Login+="Server:"; m_Login+=Respond; } else { MessageBox("PASS响应错误!"); closesocket(SocketControl); WSACleanup(); return; } } } UpdateData(false);}voidCFtpClientDlg::OnList(){ if(!DataConnect())//建立数据连接 return; memset(Command,0,MAX_SIZE);//合成LIST命令 memcpy(Command,"LIST",strlen("LIST")); memcpy(Command+strlen("LIST"),"\r\n",2); if(!SendCommand())//发送LIST命令 return; m_Login+="Client:"; m_Login+=Command; if(!RecvRespond()) return; else { if(RespondCode==125||RespondCode==150||RespondCode==226) { m_Login+="Server:"; m_Login+=Respond; } else { MessageBox("LIST响应错误!"); closesocket(SocketControl); WSACleanup(); return; } } m_Login+="Client:......\r\n"; while(true) {charListBuf[MAX_SIZE]; memset(ListBuf,0,MAX_SIZE); nRecv=recv(SocketData,ListBuf,MAX_SIZE,0);intnRecv; if(nRecv==SOCKET_ERROR)//读取目录信息 { MessageBox("LIST接收错误!"); closesocket(SocketData); WSACleanup(); return; } if(nRecv<=0) break; m_Directory=ListBuf;//显示目录信息 } closesocket(SocketData);//关闭数据连接 if(!RecvRespond()) return; else { if(RespondCode==226)//判断LIST应答码 { m_Login+="Server:"; m_Login+=Respond; } else { MessageBox("LIST响应错误!"); closesocket(SocketControl); WSACleanup(); return; } } UpdateData(false);}voidCFtpClientDlg::OnQuit(){ memset(Command,0,MAX_SIZE);//合成QUIT命令 memcpy(Command,"QUIT",strlen("QUIT")); memcpy(Command+strlen("QUIT"),"\r\n",2); if(!SendCommand())//发送QUIT命令 return; else { if(RespondCode==221)//判断QUIT应答码 { m_Login+="Server:"; m_Login+=Respond; m_Directory=""; } else { MessageBox("QUIT响应错误!"); closesocket(SocketControl); WSACleanup(); return; } } UpdateData(false); closesocket(SocketControl); WSACleanup();//释放套接字绑定}boolCFtpClientDlg::DataConnect(){ memset(Command,0,MAX_SIZE);//合成PASV命令 memcpy(Command,"PASV",strlen("PASV")); memcpy(Command+strlen("PASV"),"\r\n",2); if(!SendCommand())//发送PASV命令 returnfalse; if(!RecvRespond()) returnfalse; else { if(RespondCode!=227)//判断PASV应答码 { MessageBox("PASV响应错误!"); closesocket(SocketControl); WSACleanup(); returnfalse; } } char*part[6]; if(strtok(Respond,"("))//分离PASV应答信息 { for(inti=0;i<5;i++) { part[i]=strtok(NULL,","); if(!part[i]) returnfalse; } part[5]=strtok(NULL,")"); if(!part[5]) returnfalse; } else returnfalse; unsignedshortServerPort;//获取服务器数据端口 ServerPort=unsignedshort((atoi(part[4])<<8)+atoi(part[5])); SocketData=socket(AF_INET,SOCK_STREAM,0);//创建连接套接字 if(SocketData==INVALID_SOCKET) { MessageBox("创建数据Socket失败!"); closesocket(SocketControl); WSACleanup(); returnfalse; } intIpAddress;//判断域名或IP地址 IpAddress=inet_addr(m_Address); if(IpAddress==INADDR_NONE) { hostent*pHostent=gethostbyname(m_Address); if(pHostent) IpAddress=(*(in_addr*)pHostent->h_addr).s_addr; } sockaddr_inserveraddr2;//定义套接字地址 memset(&serveraddr2,0,sizeof(serveraddr2)); serveraddr2.sin_family=AF_INET; serveraddr2.sin_port=htons(ServerPort); serveraddr2.sin_addr.s_addr=IpAddress; intnConnect; nConnect=connect(SocketData,(sockaddr*)&serveraddr2,sizeof(serveraddr2)); if(nConnect==SOCKET_ERROR)//建立FTP数据连接 { MessageBox("数据连接建立失败!"); closesocket(SocketControl); closesocket(SocketData); WSACleanup(); returnfalse; } returntrue;}boolCFtpClientDlg::RecvRespond(){ intnRecv; memset(Respond,0,MAX_SIZE); nRecv=recv(SocketControl,Respond,MAX_SIZE,0); if(nRecv==SOCKET_ERROR)//通过连接接收响应 { MessageBox("Socket接收失败!"); closesocket(SocketControl); WSACleanup(); returnfalse; } char*ReplyCodes=newchar[3];//从响应中解析响应码 memset(ReplyCodes,0,3); memcpy(ReplyCodes,Respond,3); RespondCode=atoi(ReplyCodes); returntrue;}boolCFtpClientDlg::SendCommand(){ intnSend; nSend=send(SocketControl,Command,strlen(Command),0); if(nSend==SOCKET_ERROR)//通过连接发送命令 { MessageBox("Socket发送失败!"); closesocket(SocketControl); WSACleanup(); returnfalse; } returntrue;}第4章POP3客户机程序设计//MailClientDlg.h:headerfile#defineMAX_SIZE4096classCMailClientDlg:publicCDialog{public: //{{AFX_DATA(CMailClientDlg) enum{IDD=IDD_MAILCLIENT_DIALOG}; CString m_Address; CString m_Login; CString m_Mail; CString m_Password; CString m_Account; //}}AFX_DATAprotected: //{{AFX_MSG(CMailClientDlg) afx_msgvoidOnConnect(); afx_msgvoidOnQuit(); afx_msgvoidOnReceive(); //}}AFX_MSGprivate: boolRecvRespond(); boolSendCommand(); charCommand[MAX_SIZE]; charRespond[MAX_SIZE]; boolRespondStatue; SOCKETSocket;};//MailClientDlg.cpp:implementationfile#include"stdafx.h"#include"MailClient.h"#include"MailClientDlg.h"#include"winsock.h"voidCMailClientDlg::OnConnect(){ WSADATAWSAData; if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)//建立套接字绑定 { MessageBox("初始化Winsock失败!"); return; } Socket=socket(AF_INET,SOCK_STREAM,0);//创建连接套接字 if(Socket==INVALID_SOCKET) { MessageBox("创建Socket失败!"); WSACleanup(); return; } intIpAddress; //判断域名或IP地址 IpAddress=inet_addr(m_Address); if(IpAddress==INADDR_NONE) { hostent*pHostent=gethostbyname(m_Address); if(pHostent) IpAddress=(*(in_addr*)pHostent->h_addr).s_addr; } sockaddr_inserveraddr;//定义套接字地址 memset(&serveraddr,0,sizeof(serveraddr)); serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(110); serveraddr.sin_addr.s_addr=IpAddress; intnConnect; nConnect=connect(Socket,(sockaddr*)&serveraddr,sizeof(serveraddr)); if(nConnect==SOCKET_ERROR)//与服务器建立连接 { MessageBox("连接建立失败!"); closesocket(Socket); WSACleanup(); return; } m_Login+="Client:Connectto"; m_Login+=m_Address; m_Login+="...\r\n"; if(!RecvRespond()) return; else { if(RespondStatue==true)//判断连接响应状态 { m_Login+="Server:"; m_Login+=Respond; } else { MessageBox("连接响应错误!"); closesocket(Socket); WSACleanup(); return; } } memset(Command,0,MAX_SIZE);//合成USER命令 memcpy(Command,"USER",strlen("USER")); memcpy(Command+strlen("USER"),m_Account,strlen(m_Account)); memcpy(Command+strlen("USER")+strlen(m_Account),"\r\n",2); if(!SendCommand())//发送USER命令 return; m_Login+="Client:"; m_Login+=Command; if(!RecvRespond()) return; else { if(RespondStatue==true)//判断USER响应状态 { m_Login+="Server:"; m_Login+=Respond; } else { MessageBox("USER响应错误!"); closesocket(Socket); WSACleanup(); return; } } memset(Command,0,MAX_SIZE);//合成PASS命令 memcpy(Command,"PASS",strlen("PASS")); memcpy(Command+strlen("PASS"),m_Password,strlen(m_Password)); memcpy(Command+strlen("PASS")+strlen(m_Password),"\r\n",2); if(!SendCommand())//发送PASS命令 return; m_Login+="Client:PASS*******\r\n"; if(!RecvRespond()) return; else { if(RespondStatue==true)//判断PASS响应状态 { m_Login+="Server:"; m_Login+=Respond; } else { MessageBox("PASS响应错误!"); closesocket(Socket); WSACleanup(); return; } } UpdateData(false);}voidCMailClientDlg::OnReceive(){ memset(Command,0,MAX_SIZE);//合成STAT命令 memcpy(Command,"STAT",strlen("STAT")); memcpy(Command+strlen("STAT"),"\r\n",2); if(!SendCommand())//发送STAT命令 return; m_Login+="Client:"; m_Login+=Command; if(!RecvRespond()) return; else { if(RespondStatue==true)//判断STAT响应状态 { m_Login+="Server:"; m_Login+=Respond; } else { MessageBox("STAT响应错误!"); closesocket(Socket); WSACleanup(); return; } } memset(Command,0,MAX_SIZE);//合成RETR命令 memcpy(Command,"RETR",strlen("RETR")); memcpy(Command+strlen("RETR"),"1\r\n",3); if(!SendCommand())//发送RETR命令 return; m_Login+="Client:"; m_Login+=Command; if(!RecvRespond()) return; else { if(RespondStatue==true)//判断RETR响应状态 { m_Login+="Server:"; m_Login+=Respond; } else { MessageBox("RETR响应错误!"); closesocket(Socket); WSACleanup(); return; } } while(true) {charMailBuf[MAX_SIZE]; memset(MailBuf,0,MAX_SIZE);intnRecv; nRecv=recv(Socket,MailBuf,MAX_SIZE,0); if(nRecv==SOCKET_ERROR) //读取邮件信息 { MessageBox("RETR接收错误!"); closesocket(Socket); WSACleanup(); return; } m_Mail+=MailBuf;//显示邮件信息 if(strstr(MailBuf,"\r\n.\r\n")) break; } UpdateData(false);}voidCMailClientDlg::OnQuit(){ memset(Command,0,MAX_SIZE);//合成QUIT命令 memcpy(Command,"QUIT",strlen("QUIT")); memcpy(Command+strlen("QUIT"),"\r\n",2); if(!SendCommand())//发送QUIT命令 return; m_Login+="Client:"; m_Login+=Command; if(!RecvRespond()) return; else { if(RespondStatue==true)//判断QUIT响应状态 { m_Login+="Server:"; m_Login+=Respond; m_Mail=""; } else { MessageBox("QUIT响应错误!"); closesocket(Socket); WSACleanup(); return; } } UpdateData(false); closesocket(Socket); WSACleanup();//释放套接字绑定}boolCMailClientDlg::RecvRespond(){ intnRecv; memset(Respond,0,MAX_SIZE); nRecv=recv(Socket,Respond,MAX_SIZE,0); if(nRecv==SOCKET_ERROR)//通过连接接收响应 { MessageBox("Socket接收失败!"); closesocket(Socket); WSACleanup(); returnfalse; } if(memcmp(Respond,"+OK",3)==0) //从响应中解析响应状态 RespondStatue=true; else RespondStatue=false; returntrue;}boolCMailClientDlg::SendCommand(){ intnSend; nSend=send(Socket,Command,strlen(Command),0); if(nSend==SOCKET_ERROR)//通过连接发送命令 { MessageBox("Socket发送失败!"); closesocket(Socket); WSACleanup(); returnfalse; } returntrue;}第5章WWW客户机程序设计//WebClientDlg.h:headerfile#defineMAX_SIZE4096classCWebClientDlg:publicCDialog{public: //{{AFX_DATA(CWebClientDlg) enum{IDD=IDD_WEBCLIENT_DIALOG}; CString m_Html; CString m_Http; CString m_Url; //}}AFX_DATAprotected: //{{AFX_MSG(CWebClientDlg) afx_msgvoidOnBrowse(); //}}AFX_MSGprivate: charCommand[MAX_SIZE]; charRespond[MAX_SIZE]; boolRespondStatue; SOCKETSocket;};//WebClientDlg.cpp:implementationfile#include"stdafx.h"#include"WebClient.h"#include"WebClientDlg.h"#include"winsock.h"voidCWebClientDlg::OnBrowse(){ WSADATAWSAData;//建立套接字绑定 if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) { MessageBox("初始化Winsock失败!"); return; } Socket=socket(AF_INET,SOCK_STREAM,0);//创建连接套接字 if(Socket==INVALID_SOCKET) { MessageBox("创建Socket失败!"); WSACleanup(); return; } CStringTempUrl;//从URL删除协议 if(strstr(m_Url,"http://")) TempUrl=m_Url.Mid(7,m_Url.GetLength()-7); else TempUrl=m_Url; intUrlPos;//从URL提取主机名 CStringHostName; CStringFilePath; UrlPos=TempUrl.Find("/",0); HostName=TempUrl.Mid(0,UrlPos); FilePath=TempUrl.Mid(UrlPos,m_Url.GetLength()-UrlPos); intIpAddress; //判断域名或IP地址 IpAddress=inet_addr(HostName); if(IpAddress==INADDR_NONE) { hostent*pHostent=gethostbyname(HostName); if(pHostent) IpAddress=(*(in_addr*)pHostent->h_addr).s_addr; } sockaddr_inserveraddr;//定义套接字地址 memset(&serveraddr,0,sizeof(serveraddr)); serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(80); serveraddr.sin_addr.s_addr=IpAddress; intnConnect;//与服务器建立连接 nConnect=connect(Socket,(sockaddr*)&serveraddr,sizeof(serveraddr)); if(nConnect==SOCKET_ERROR) { MessageBox("连接建立失败!"); closesocket(Socket); WSACleanup(); return; } memset(Command,0,MAX_SIZE);//生成GET命令 memcpy(Command,"GET",4); memcpy(Command+4,FilePath,strlen(FilePath)); memcpy(Command+4+strlen(FilePath),"HTTP/1.1\r\nHost:",17); memcpy(Command+21+strlen(FilePath),HostName,strlen(HostName)); memcpy(Command+21+strlen(FilePath)+strlen(HostName),"\r\n\r\n",4); intnSend;//发送GET命令 nSend=send(Socket,Command,strlen(Command),0); if(nSend==SOCKET_ERROR) { MessageBox("Socket发送失败!"); closesocket(Socket); WSACleanup(); return; } m_Http+=Command; CStringRecvBuf; while(true) { memset(Respond,0,MAX_SIZE);intnRecv;//接收GET响应 nRecv=recv(Socket,Respond,MAX_SIZE,0); if(nRecv==SOCKET_ERROR) { MessageBox("Socket接收失败!"); closesocket(Socket); WSACleanup(); return; } RecvBuf+=Respond; if(strstr(Respond,"</html>\r\n")) break; } CStringRespCode;//从响应解析响应码 RespCode=RecvBuf.Mid(9,3); intHtmlPos;//从响应中提取HTML CStringRespText; CStringHtmlText; if(atoi(RespCode)==200) { HtmlPos=RecvBuf.Find("<html>",0); RespText=RecvBuf.Mid(0,HtmlPos); HtmlText=RecvBuf.Mid(HtmlPos,RecvBuf.GetLength()-HtmlPos); } else { MessageBox("GET响应错误!"); closesocket(Socket); WSACleanup(); return; } m_Http+=RespText; m_Html+=HtmlText; UpdateData(false); closesocket(Socket); WSACleanup();//释放套接字绑定}第6章SNMP管理器程序设计//SnmpClientDlg.h:headerfile#defineGET_REQUEST1#defineGET_NEXT_REQUEST2#defineSET_REQUEST3#defineGET_RESPONSE4classCSnmpClientDlg:publicCDialog{public: //{{AFX_DATA(CSnmpClientDlg) enum{IDD=IDD_SNMPCLIENT_DIALOG}; CString m_Address; CString m_Community; CString m_Object; int m_Version; CString m_Information; CString m_Value; //}}AFX_DATAprotected: //{{AFX_MSG(CSnmpClientDlg) afx_msgvoidOnGet(); afx_msgvoidOnSet(); //}}AFX_MSGprivate: typedefstructSNMP_PDU//SNMPPDU结构 { intVersion;//版本号 charCommunity[8];//团体名 intPduType;//PDU类型 intRequestId;//请求标识符 intErrorStatus; //错误状态 intErrorIndex;//错误索引号 charObjectName[16];//对象名 charObjectValue[16]; //对象值 }snmp_pdu; typedefstructSNMP_MIB//SNMPMIB结构 { charObjectName[16];//对象名 charObjectValue[16]; //对象值 }snmp_mib; SOCKETSocket; sockaddr_inserveraddr; intserveraddrlen; snmp_pduSendPdu; snmp_pduRecvPdu; boolRecvError(snmp_pdurecvpdu,snmp_pdusendpdu); voidPduType(inttype); boolInitSocket();};//SnmpClientDlg.cpp:implementationfile#include"stdafx.h"#include"SnmpClient.h"#include"SnmpClientDlg.h"#include"winsock.h"voidCSnmpClientDlg::OnGet(){ if(!InitSocket())//初始化套接字 return; if(m_Object=="") { MessageBox("Object不能为空!"); closesocket(Socket); WSACleanup(); return; } SendPdu.Version=m_Version;//填充发送PDU strcpy(SendPdu.Community,LPCTSTR(m_Community)); SendPdu.PduType=GET_REQUEST; SendPdu.RequestId=100; SendPdu.ErrorStatus=0; SendPdu.ErrorIndex=0; strcpy(SendPdu.ObjectName,LPCTSTR(m_Object)); strcpy(SendPdu.ObjectValue,LPCTSTR(m_Value)); PduType(SendPdu.PduType); charSendBuf[1024];//初始化发送缓冲区 memset(SendBuf,'\0',1024); intPduLen; PduLen=sizeof(SendPdu); memcpy(SendBuf,&SendPdu,PduLen); intnSend; nSend=sendto(Socket,SendBuf,PduLen,0,(sockaddr*)&serveraddr,serveraddrlen); if(nSend==SOCKET_ERROR)//通过端口发送数据 { MessageBox("套接字Send失败!"); closesocket(Socket); WSACleanup(); return; } charRecvBuf[1024];//初始化接收缓冲区 memset(RecvBuf,'\0',1024); intnRecv; nRecv=recvfrom(Socket,RecvBuf,1024,0,(sockaddr*)&serveraddr,&serveraddrlen); if(nRecv==SOCKET_ERROR)//通过端口接收数据 { MessageBox("套接字Recv失败!"); closesocket(Socket); WSACleanup(); return; } RecvPdu=*(snmp_pdu*)RecvBuf;//填充接收PDU if(!RecvError(RecvPdu,SendPdu)) return; PduType(RecvPdu.PduType); closesocket(Socket);//关闭套接字 WSACleanup(); UpdateData(false);}voidCSnmpClientDlg::OnSet(){ if(!InitSocket())//初始化套接字 return; if(m_Object==""||m_Value=="") { MessageBox("Object与Value不能为空!"); closesocket(Socket); WSACleanup(); return; } SendPdu.Version=m_Version;//填充发送PDU strcpy(SendPdu.Community,LPCTSTR(m_Community)); SendPdu.PduType=SET_REQUEST; SendPdu.RequestId=100; SendPdu.ErrorStatus=0; SendPdu.ErrorIndex=0; strcpy(SendPdu.ObjectName,LPCTSTR(m_Object)); strcpy(SendPdu.ObjectValue,LPCTSTR(m_Value)); PduType(SendPdu.PduType); charSendBuf[1024];//初始化发送缓冲区 memset(SendBuf,'\0',1024); intPduLen; PduLen=sizeof(SendPdu); memcpy(SendBuf,&SendPdu,PduLen); intnSend; nSend=sendto(Socket,SendBuf,PduLen,0,(sockaddr*)&serveraddr,serveraddrlen); if(nSend==SOCKET_ERROR)//通过端口发送数据 { MessageBox("套接字Send失败!"); closesocket(Socket); WSACleanup(); return; } charRecvBuf[1024];//初始化接收缓冲区 memset(RecvBuf,'\0',1024); intnRecv; nRecv=recvfrom(Socket,RecvBuf,1024,0,(sockaddr*)&serveraddr,&serveraddrlen); if(nRecv==SOCKET_ERROR)//通过端口接收数据 { MessageBox("套接字Recv失败!"); closesocket(Socket); WSACleanup(); return; } RecvPdu=*(snmp_pdu*)RecvBuf;//填充接收PDU if(!RecvError(RecvPdu,SendPdu)) return; PduType(RecvPdu.PduType); closesocket(Socket);//关闭套接字 WSACleanup(); UpdateData(false);}boolCSnmpClientDlg::InitSocket(){ WSADATAWSAData;//建立套接字绑定 if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) { MessageBox("初始化Winsock失败!"); returnfalse; } Socket=socket(AF_INET,SOCK_DGRAM,0);//创建数据报套接字 if(Socket==INVALID_SOCKET) { MessageBox("创建Socket失败!"); WSACleanup(); returnfalse; } intIpAddress; //判断域名或IP地址 IpAddress=inet_addr(m_Address); if(IpAddress==INADDR_NONE) { hostent*pHostent=gethostbyname(m_Address); if(pHostent) IpAddress=(*(in_addr*)pHostent->h_addr).s_addr; } serveraddr.sin_family=AF_INET;//创建套接字地址 serveraddr.sin_port=htons(161); serveraddr.sin_addr.s_addr=IpAddress; serveraddrlen=sizeof(serveraddr); returntrue;}voidCSnmpClientDlg::PduType(inttype){ CStringstr; switch(type)//判断SNMPPDU类型 { case1: str.Format("Manager:GetRequest"); m_Information+=str; m_Information+=SendPdu.ObjectName; m_Information+="\r\n"; break; case2: str.Format("Manager:GetNextRequest"); m_Information+=str; m_Information+=SendPdu.ObjectName; m_Information+="\r\n"; break; case3: str.Format("Manager:SetRequest"); m_Information+=str; m_Information+=SendPdu.ObjectName; m_Information+="="; m_Information+=SendPdu.ObjectValue; m_Information+="\r\n"; break; case4: str.Format("Agent:GetResponse"); m_Information+=str; m_Information+=RecvPdu.ObjectName; m_Information+="="; m_Information+=RecvPdu.ObjectValue; m_Information+="\r\n"; break; default: str=""; m_Information+=str; m_Information+="\r\n"; }}boolCSnmpClientDlg::RecvError(snmp_pdurecvpdu,snmp_pdusendpdu){ CStringstr; if(recvpdu.Version!=m_Version)//判断SNMPPDU错误 { str.Format("Version字段错误!"); MessageBox(str); returnfalse; } if(recvpdu.Community!=m_Community) { str.Format("Community字段错误!"); MessageBox(str); returnfalse; } if(recvpdu.PduType!=GET_RESPONSE) { str.Format("PduType字段错误!"); MessageBox(str); returnfalse; } if(recvpdu.RequestId!=sendpdu.RequestId) { str.Format("RequestId字段错误!"); MessageBox(str); returnfalse; } if(recvpdu.ErrorStatus!=0) { str.Format("SNMPAgent操作错误!"); MessageBox(str); returnfalse; } returntrue;}第7章主机端口扫描程序设计//FindPortDlg.h:headerfileclassCFindPortDlg:publicCDialog{public: //{{AFX_DATA(CFindPortDlg) enum{IDD=IDD_FINDPORT_DIALOG}; CString m_Address; CString m_Status; CString m_Port; //}}AFX_DATAprotected: //{{AFX_MSG(CFindPortDlg) afx_msgvoidOnTcpscan(); afx_msgvoidOnUdpscan(); //}}AFX_MSGprivate: SOCKETSocket;};//FindPortDlg.cpp:implementationfile#include"stdafx.h"#include"FindPort.h"#include"FindPortDlg.h"#include"winsock.h"voidCFindPortDlg::OnTcpscan(){ UpdateData(true); m_Status+="TCP WSADATAWSAData;//建立套接字绑定 if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) { MessageBox("初始化Winsock失败!"); return; } Socket=socket(AF_INET,SOCK_STREAM,0);//创建连接套接字 if(Socket==INVALID_SOCKET) { MessageBox("创建Socket失败!"); WSACleanup(); return; } intIpAddress; //判断域名或IP地址 IpAddress=inet_addr(m_Address); if(IpAddress==INADDR_NONE) { hostent*pHostent=gethostbyname(m_Address); if(pHostent) IpAddress=(*(in_addr*)pHostent->h_addr).s_addr; } sockaddr_inDestHost;//定义套接字地址 memset(&DestHost,0,sizeof(DestHost)); DestHost.sin_family=AF_INET; DestHost.sin_port=htons(atoi(m_Port)); DestHost.sin_addr.s_addr=IpAddress; intnConnect;//与服务器建立连接 nConnect=connect(Socket,(sockaddr*)&DestHost,sizeof(DestHost)); if(nConnect==SOCKET_ERROR) { m_Status+=m_Port; m_Status+=":Close\r\n"; } else { m_Status+=m_Port; m_Status+=":Open\r\n"; } UpdateData(false); closesocket(Socket); WSACleanup();//释放套接字绑定}voidCFindPortDlg::OnUdpscan(){ UpdateData(true); m_Status+="UDP WSADATAWSAData;//建立套接字绑定 if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) { MessageBox("初始化Winsock失败!"); return; } Socket=socket(AF_INET,SOCK_DGRAM,0);//创建连接套接字 if(Socket==INVALID_SOCKET) { MessageBox("创建Socket失败!"); WSACleanup(); return; } intnIotrl;//设置非阻塞模式 unsignedlongFlag=1; nIotrl=ioctlsocket(Socket,FIONBIO,&Flag); if(nIotrl==SOCKET_ERROR) { MessageBox("设置Socket模式失败!"); closesocket(Socket); WSACleanup(); return; } intIpAddress; //判断域名或IP地址 IpAddress=inet_addr(m_Address); if(IpAddress==INADDR_NONE) { hostent*pHostent=gethostbyname(m_Address); if(pHostent) IpAddress=(*(in_addr*)pHostent->h_addr).s_addr; } sockaddr_inDestHost;//定义目的主机地址 memset(&DestHost,0,sizeof(DestHost)); DestHost.sin_family=AF_INET; DestHost.sin_port=htons(atoi(m_Port)); DestHost.sin_addr.s_addr=IpAddress; char*SendBuf;//定义接收缓冲区 SendBuf=newchar[2]; memset(SendBuf,0,2); intnSend;//发送UDP数据包 nSend=sendto(Socket,SendBuf,1,0,(structsockaddr*)&DestHost,sizeof(DestHost)); if(nSend==SOCKET_ERROR) { MessageBox("UDP包发送失败!"); closesocket(Socket); WSACleanup(); return; } Sleep(500); sockaddr_inSourceHost;//定义源主机地址 intSourceSize; SourceSize=sizeof(SourceHost); memset(&SourceHost,0,SourceSize); char*RecvBuf;//定义接收缓冲区 RecvBuf=newchar[2]; memset(RecvBuf,0,2); intnRecv;//接收UDP数据包 nRecv=recvfrom(Socket,RecvBuf,1,0,(structsockaddr*)&SourceHost,&SourceSize); if(nRecv==SOCKET_ERROR) { intErrorCode=GetLastError();//RecvFrom错误类型 if(ErrorCode==10054) { m_Status+=m_Port; m_Status+=":Close\r\n"; } if(ErrorCode==10035) { m_Status+=m_Port; m_Status+=":Open\r\n"; } } else { m_Status+=m_Port; m_Status+=":Open\r\n"; } UpdateData(false); closesocket(Socket); WSACleanup();//释放套接字绑定}第8章网络主机扫描程序设计//FindHostDlg.h:headerfile#defineICMP_MIN8#defineDEF_PACKET32#defineMAX_PACKET1024classCFindHostDlg:publicCDialog{public: //{{AFX_DATA(CFindHostDlg) enum{IDD=IDD_FINDHOST_DIALOG}; CString m_Address; CString m_Status; //}}AFX_DATAprotected: //{{AFX_MSG(CFindHostDlg) afx_msgvoidOnScan(); //}}AFX_MSGprivate: shortCheckSum(short*buffer,intsize); SOCKETSocket; typedefstructIP_HEAD//IP头部结构 { union { unsignedcharVersion; //版本(字节前4位) unsignedcharHeadLen; //头部长度(字节后4位) }; unsignedcharServiceType; //服务类型 unsignedshortTotalLen;//总长度 unsignedshortIdentifi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论