网络扫描技术揭秘读书笔记2--扫描器中公用编程示例(2)

1. 多线程的局限性和使用方式

(1)与扫描器开发相关的程序大多是多线程的。Windows下多线程程序需要考虑的问题:
(1).运用多线程并不是绝对地能提高整个程序的性能。例如,一个应用如果可以拆分成若干个相同或相似的任务,而这些任务都是一些需要运行在“运行-等待-运行”模式的,则一些线程可以在其他线程处于“等待”状态的时候得到运行,使各线程的运行达到了统筹,进而使整个程序的运行得到了改善;而如果这些线程本身全部处于“运行”模式,则每一个线程的运行都占用了大量时间片,从整体上看,虽然各线程同样是得到了并行处理,但从实践上看,与这些线程所代表的任务一个个地运行,效果是相同的

(2).一个进程所能创建的实际线程数是有限的。在实际默认情况下,一个进程可以占用2GB的逻辑空间,而一个线程在运行期要占用1MB的栈空间;则一个进程可以创建2GB/1MG=2048个线程,而实际中,进程自己也要占用堆栈空间,因此实际上能创建的线程数比这个值要小。

(3).另外一个重要的影响效率的因素就是图形化的显示,因为每刷新一下界面,都要花费大量的系统资源,如果频繁地刷新界面,反而使界面来不及刷新,最终导致程序像死机一样

(2)创建线程函数

CWinThread*AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL,UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs = NULL );

CWinThread*AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority =THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0,LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

二者等价,都可以新创建一个指定类型的新线程,但前者创建的是一个工作线程(即不需要界面,不需要处理消息的简单线程),后者则是一个用户接口线程既可以有自己的界面,又可以独立处理自己的消息)。

返回值:指向新线程的句柄。

在线程创建完毕,线程即可进入运行状态。在线程中,可以通过AfxEndThread函数退出线程运行,但并不建议这样做,而是由线程自己退出

根据经验,每次在调用AfxBeginThread创建线程之后,都应该调用一下Sleep函数,使线程有时间读取参数

这样做有以下两个原因

每一线程的创建总是要花一些时间的,而如果AfxBeginThread函数的位置在调用AfxBeginThread函数的函数体最后,该母函数会因AfxBeginThread调用成功而返回,但此时线程有可能还没初始化成功,或虽然初始化完毕,但要接收的参数还没有接收完(因为这时AfxBeginThread函数的母函数已返回),最终导致崩溃性错误(显示内存不能为读)。

在创建多个线程时,通常是采用一个循环,在循环体内连续调用AfxBeginThread函数。如果各线程的参数不同,且AfxBeginThread函数之间没有间隔,则线程创建后,有时会出现读取参数的混乱(后创建的线程,在读参数的时候,参数已变成另一组新的值)。

2. VC++下Windows Socket的使用

使用Microsoft Visual C++开发针对网络Socket的编程,一般有两种方法,一种是直接使用基于Socket的API(ApplicationProgramming Interface,应用程序编程接口),另一种是使用MFC(Microsoft FoundationClasses,微软基础类库)编程。二者各有利弊,前者使用较为麻烦,编程者不仅需要记住某项应用中所使用的API函数,还需要知道这些API的调用顺序、各个具有传递作用的参数等项后者以类的方式出现,通过封装,可以隐藏掉很多的细节,从而使其编程方法相对简单很多。而关于扫描器的开发,MFC并不能完全胜任,就不得不用到基于API的方式

(1)CSocket的应用

MicrosoftVisual C++的MFC针对网络编程提供了两个类,一个是CAsyncSocket类,另一个是CSocket类,后者对前者进行了继承和扩充,所以可以认为CSocket类更简单、更强大,但隐藏了很多底层的细节CAsyncSocket类接近于一些底层的控制

要使用CSocket类,只需在标准程序生成的向导中,选择“Windows Sockets”选项即可。

或者通过以下方式手工添加代码的实现:

首先,需要在“StdAfx.h”的最后添加代码:

#include<afxsock.h>    //标准CSocket类使用的头文件

其次,还需要在××××.App(××××是工程名)文件的BOOL InitInstance()函数的最前面添加代码:

if(!AfxSocketInit()) 

    AfxMessageBox("Socket initerror."); 

    return FALSE; 

}

(2)Socket2的应用

通常的网络Socket编程,直接使用CSocket就可以了,但是作为一些偏底层的编程,常常会用到一些不常用的API函数和一些API的非常规用法,这时,就要用到Socket2

使用Socket2,需要在合适的头文件中,加入如下语句:

#include <winsock2.h>

除了需要必要的头文件之外,还需要一些静态链接库ws2_32.lib文件。

在上面头文件之后加入如下语句:

#pragma comment(lib, "ws2_32.lib")

然后在系统初始化的时候,对Socket2进行初始化,初始化的代码如下:

WORDwVersionRequested; 

WSADATAwsaData; 

wVersionRequested= MAKEWORD(2,0); 

interr=WSAStartup( wVersionRequested, &wsaData ); 

if (err!= 0 ) 

    MessageBox("当前系统,不支持Socket2的运行,但当前程序必须使用Socket2或以上。"); 

    return; 

}

(3)CSocket和Socket2同时使用

在特殊情况下,要同时使用CSocket和Socket2,如果简单地将上述二者代码进行合并使用,会导致大量网络常量和结构重复定义

只需要注意在包含头文件的时候,先包含winsock2.h,再包含afxsock.h

后面依次跟上CStocket和Socket2的初始化代码即可。

3.网卡的混杂模式

(1)混杂模式简介

无论在混杂模式下,还是在常规模式下,网卡都会接到很多的数据包,这些数据包有些是发给该网卡的,有些不是发给该网卡的。当处于“常规模式”,网卡会自动过滤那些不是给网卡自己的数据包,而只让那些发给本网卡的数据通过。而在“混杂模式”下,所有的数据都不经过过滤而直接发送给操作系统内核进行处理

由于“混杂模式”会使本已没用的数据再进行更高一级的处理,增加了系统的负担,最终还是被高一级协议过滤掉或扔掉(不一定是全部被过滤掉,而是大部分被当做无用数据而不予处理),因此网卡默认的状态都是常规模式

“混杂模式”的状态下,网卡所要完成的只是“监听”,而不会“截止”、或“中断”这些来自网络的数据包。

下图是网络中常见的几种监测模式。


监听模式”是负责监听的程序在不干扰原有通信的前提下,只对数据进行监测,嗅探方法正是基于这个原理。

转发模式”是通过拦截发送端的数据实现数据的中断,然后再通过转发,将数据转发给接收端。

过滤模式”与“转发模式”很像,所不同的是过滤模式并不是无条件转发,而是在转发之前对要转发的数据进行过滤,符合一定条件的才转发,否则就不转发。

截止模式”很简单,就是无条件地拦截由“发送端”给“接收端”的数据

(2)混杂模式的意义

在描述“混杂模式”的作用时,很多人将其最大的功能描述为能接收所有发送至该网卡的IP数据包,这种说法并没有错,特别是在早期的集线器时代。但到了交换机的时代,这种现象并不常见。

当前以交换机作为交换设备的网络中,即使是将某一个网卡设置成“混杂模式”,除非使用一些特殊技术,网卡本身一般是接不到不是发送给自身的数据,所接到的只是给本身IP的数据和广播数据,但这时RAW Socket可以监听所有的数据了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网络扫描技术揭秘:原理、实践与扫描器的实现》系统地介绍网络扫描器的概念、原理与设计方法,饱含作者十几年来在网络技术应用实践不断总结的经验与技巧。作者从网络协议这样的基本概念开始,细致深入地分析了网络扫描器的原理,并用自己制作的大量工程代码,揭示了网络扫描器的实现方法与最佳实践。 《网络扫描技术揭秘:原理、实践与扫描器的实现》首先介绍了网络扫描技术的概念、原理、算法等,以及网络协议的意义与编程概述,随后系统分析了各种扫描器的原理与设计方法,包括TCP/UDP端口、NetBIOS、SNMP、ICMP、基于协议的服务、基于应用的服务、命名管道、服务发现、漏洞扫描器等。书在介绍每一种扫描器的时候,都是先介绍相应协议,然后对扫描器要使用的API函数进行详细说明,使读者知道该扫描器的各种技术细节;还介绍了Windows相关协议程序的安装、配置、测试和验证等,使读者有了演习场地;最后展示了扫描器编程实例。这种循序渐进、逐步深入的方式,使读者不仅全面地了解扫描器的细节,而且在遇到新情况时,能举一反三,对代码进行修改或调整。随书光盘还包含了作者精心制作与调试好的工程代码,可帮助读者快速上手,设计出自己需要的扫描器。 《网络扫描技术揭秘:原理、实践与扫描器的实现》不仅是网管员和安全技术人员必备参考书,也适合于所有想深入理解计算机网络原理、全面了解网络扫描技术的学生、教师以及安全技术爱好者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值