设为首页 加入收藏

TOP

vc++Ping命令模拟进阶----如何嗅探某个IP段(二)
2014-11-23 21:34:51 来源: 作者: 【 】 浏览:216
Tags:Ping 命令 模拟 进阶 ---- 如何 某个
> 24) & 0x00FF;

return (b1 <<24) | (b2 << 16) | (b3 << 8) | b4;
}

//多地址扫描
void IpCheck::MutiScan(char *s_ip, char *e_ip)
{
in_addr ia;
unsigned long FirstIp,SecondIp;
int Delta;
char* Addr;

FirstIp = inet_addr(s_ip); //任意的开始地址
SecondIp = inet_addr(e_ip); //任意的结束地址

//转换成能直接递增和递减的地址
FirstIp = InvertIp(FirstIp);
SecondIp = InvertIp(SecondIp);

Delta = SecondIp - FirstIp;
s_array->InitBuf(Delta + 1);

for(int i = 0; i <= Delta;i++)
{
ia.S_un.S_addr = InvertIp(FirstIp++);

Addr = inet_ntoa(ia);
//扫描
IsIPActive(Addr);
}
}


当我们可以扫描IP后,如何记录和打印所有活动的IP呢?一般人可能都想到用STL,我个人以前用STL有点阴影,所以自己写了一个字符串数组存储数据结构。自己写的心里有数,灵活性高,可以随时写些满足自己需求的代码,我就贴出这个存储类

StringArray.h
Java代码
#pragma once

//这个是自己写的一个char型指针的字符串存储数据结构,使用的是数组,没有用STL是因为还没习惯使用STL,曾经给我带来阴影
//自己写的灵活性大,方便自己使用

class StringArray
{
public:
StringArray(void);
StringArray(int length);
~StringArray(void);

void InitBuf(int length);
int Insert(char *str);
char *GetString(int index);
char **WrapBuffer();
int GetLength();
void Release();

private:
char **strbuf;
int length;
int count;
};


StringArray.cpp
Java代码
#include "StdAfx.h"
#include "StringArray.h"

StringArray::StringArray(void)
{
length = 0;
strbuf = NULL;
count = 0;
}

StringArray::StringArray(int length)
{
this->length = length;
strbuf = (char **)malloc(sizeof(char *) * length);
count = 0;
}

StringArray::~StringArray(void)
{
Release();
}

void StringArray::InitBuf(int length)
{
this->length = length;
strbuf = (char **)malloc(sizeof(char *) * length);
for(int i = 0;i < length;i++)
strbuf[i] = NULL;
}

int StringArray::Insert(char *str)
{
if(str == NULL || count == length)
return DEFAULT_ERROR;

strbuf[count] = (char *)malloc(sizeof(char) * (strlen(str) + 1));
if(strbuf[count] == NULL)
return DEFAULT_ERROR;
memset(strbuf[count], 0, strlen(str) + 1);
memcpy(strbuf[count], str, strlen(str));
strbuf[count][strlen(str)] = '\0';
count++;
return DEFAULT_SUCCESS;
}

char *StringArray::GetString(int index)
{
if(index > length || index < -1)
return NULL;

return strbuf[index];
}

int StringArray::GetLength()
{
return length;
}

char **StringArray::WrapBuffer()
{
return strbuf;
}

void StringArray::Release()
{
if(strbuf != NULL)
{
for(int i = 0;i < length;i++)
{
if(strbuf[i] != NULL)
{
free(strbuf[i]);
strbuf[i] = NULL;
}
}
free(strbuf);
strbuf = NULL;
}
}


有了这些我们就可以实现主函数了

Java代码
int _tmain(int argc, _TCHAR* argv[])
{
if(argc > 3)
printf("Error parameter:argc > 3\n");

char *param1 = NULL;
char *param2 = NULL;
IpCheck si;
if(argv[1] != NULL && argv[2] != NULL)
{
param1 = w2c(argv[1]);
param2 = w2c(argv[2]);
si.MutiScan(param1, param2);
}
else if(argv[1] != NULL)
{
param1 = w2c(argv[1]);
si.MutiScan(param1, param1);
}
else
{
printf("Error parameter\n");
return 0;
}

char **rs = si.GetIps();
int count = 0;
printf("存在的IP为:\n");
for(int i = 0;i < si.IpCounts();i++)
{
if(rs[i] == NULL)
break;

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC程序调试和纠错技巧总结 下一篇VC多线程编程之线程创建与示例

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: