ronnie
IP网段扫描
端口扫描
21
ronnie
5.2 体会
通过本次的课程设计加深了本人对TCP/IP协议特别是网络层协议,IP首部格式,ICMP首部格式的理解。对Windows网络编程也有初步的了解,掌握了基本的套接字程序的编写。理解原始套接字的运行机制,加深一些协议字段的理解。编写过程遇到的困难也不少,但是依靠钻研精神,逐步对网络编程步骤产生了整体的印象,这对以后的学习也是一笔宝贵的财富。以前学习总是停留在纸面上理论上,虽然貌似一些概念是清楚了,但是这样的记忆是不长久的。只有通过理论联系实际,编写一些代码,实现一些功能,才能加强记忆,学以致用。
六、参考文献
6.1 参考书目
[1] W.Richard Stevens,Bill Fenner,Andrew M.Rudoff. Unix Network Programming Volume1:The Sockets Networking API,Third Edition. Pearson
22
ronnie
Education,2010 [2] Wnthony Jones,Jim Ohlund. Network Programming for Microsoft Windows,Second Edition.Microsoft Press,2002
[3] 谢希仁.计算机网络(第四版).电子工业出版社,2003
[4] 周鸣争,严楠,丁刚等.计算机网络教程.清华大学出版社,2011
6.2 引用网址
http://msdn.microsoft.com/en-us/library/windows/desktop/ms741416(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
http://www.ietf.org/rfc.html
http://datatracker.ietf.org/doc/rfc792/
http://baike.http://www.wodefanwen.com//view/700108.htm
http://baike.http://www.wodefanwen.com//view/30564.htm
http://zh.wikipedia.org/zh-cn/RFC
源代码
Scanner,h //IP首部
typedef struct ip_hdr { unsigned char iphVerLen; // 版本号和头长度(各占4位) unsigned char ipTOS; // 服务类型 unsigned short ipLength; // 封包总长度,即整个IP报的长度 unsigned short ipID; // 封包标识,惟一标识发送的每一个数据报 unsigned short ipFlags; // 标志 unsigned char ipTTL; // 生存时间,就是TTL unsigned char ipProtocol; // 协议,可能是TCP、UDP、ICMP等 unsigned short ipChecksum; // 校验和 unsigned long ipSource; // 源IP地址 unsigned long ipDestination; // 目标IP地址 }IP_HDR,*PIP_HDR;
//ICMP首部
typedef struct icmp_hdr
23
ronnie
{ unsigned char icmp_type; //类型 unsigned char icmp_code; //代码 unsigned short icmp_checksum; //检验和 unsigned short icmp_id; //唯一请求ID,通常使用进程PID unsigned short icmp_sequence; //序列号 unsigned long icmp_timestamp; //时间戳 } ICMP_HDR,*PICMP_HDR;
Scanner.c #include
#pragma comment(lib,\
#include \
#define ICMP_ECHO_REQUEST_TYPE 8 //ICMP请求类型 #define ICMP_ECHO_REQUEST_CODE 0 //ICMP请求代码 #define ICMP_ECHO_REPLY_TYPE 0 #define ICMP_ECHO_REPLY_CODE 0 #define ICMP_MINIMUM_HEADER 8
struct hostent *host; //记录主机信息 struct sockaddr_in dest; //存储目的主机信息 struct sockaddr_in from; //用于回显
//注释:常见的ICMP报文类型
// 类型 代码 描述
// 0 0 回显回答 // 3 1 主机不可达 // 3 3 端口不可达 // 8 0 请求回显
//初始化winsock动态链接库 void InitializeWinsock() { int status; WSADATA wsa; if (status=WSAStartup(MAKEWORD(2,2),&wsa)!=0) {
24
ronnie
printf(\ exit(EXIT_FAILURE); } }
//初始化ICMP首部
void InitIcmpHeader(ICMP_HDR* icmp_hdr) { char buff[sizeof(ICMP_HDR) + 32]; //ICMP报文类型,类型为8,代码为0 icmp_hdr->icmp_type = ICMP_ECHO_REQUEST_TYPE; // 请求回显 icmp_hdr->icmp_code = ICMP_ECHO_REQUEST_CODE; icmp_hdr->icmp_id = (USHORT)GetCurrentProcessId(); icmp_hdr->icmp_checksum = 0; icmp_hdr->icmp_sequence = 0; icmp_hdr->icmp_timestamp= GetTickCount(); //往ICMP头部填充信息 memset(&buff[sizeof(ICMP_HDR)], 'E', 32); }
//地址解析,解析IP地址或域名 void Resolove(char hostname[]) { if(isdigit(hostname[0])) //判断主机名是否为数字 { //printf(\执行inet_addr()...\\n\ dest.sin_addr.s_addr = inet_addr(hostname); //将主机地址写入s_addr //printf(\ } else if( (host=gethostbyname(hostname)) != 0)//判断所给主机名是否与host中的一致 { //printf(\执行gethostbyname()...\\n\ strncpy((char *)&dest.sin_addr , (char *)host->h_addr_list[0] , sizeof dest.sin_addr); //printf(\完成。\\n\ } else { printf(\解析主机失败。\\n\ exit(EXIT_FAILURE); } }
//提取目的地址低三位,用于网段扫描
void ResoloveIPAddr(char starthost[],char endhost[],int *start,int *end)
25