计算机网络课程设计 基于ICMPTCP的网段端口扫描 C语言编写(5)

2019-06-11 10:53

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 #include #include #include #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


计算机网络课程设计 基于ICMPTCP的网段端口扫描 C语言编写(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:XX医院医疗制度汇编

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: