c++ 端口扫描程序实现案例

所属分类: 软件编程 / C 语言 阅读数: 49
收藏 0 赞 0 分享

第一、原理

端口扫描的原理很简单,就是建立socket通信,切换不通端口,通过connect函数,如果成功则代表端口开发者,否则端口关闭。

所有需要多socket程序熟悉,本内容是在window环境下的

第二、单线程实现方式

// PortScanf.cpp : 定义控制台应用程序的入口点。
//
#define WIN32_LEAN_AND_MEAN
#include "stdafx.h"
#include <WinSock2.h>
#pragma comment(lib, "Ws2_32")
int scant(char *Ip, int StartPort, int EndPort)
{ 
  WSADATA wsa;
  SOCKET s;
  struct sockaddr_in server;
 
  int CurrPort;  //当前端口
  int ret;
 
  WSAStartup(MAKEWORD(2, 2), &wsa);  //使用winsock函数之前,必须用WSAStartup函数来装入并初始化动态连接库
 
  server.sin_family = AF_INET;  //指定地址格式,在winsock中只能使用AF_INET
  server.sin_addr.s_addr = inet_addr(Ip); //指定被扫描的IP地址
 
  for (CurrPort = StartPort; CurrPort <= EndPort; CurrPort++)
  {
    s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    server.sin_port = htons(CurrPort); //指定被扫描IP地址的端口号
    ret = connect(s, (struct sockaddr *)&server, sizeof(server)); //连接
 
    if (0 == ret) //判断连接是否成功
    {
      printf("%s:%d Success O(∩_∩)O~~\n", Ip, CurrPort);
      closesocket(s);
    }
    else {
      printf("%s:%d Failed\n", Ip, CurrPort);
    }
  } 
  printf("Cost time:%f second\n", CostTime); //输出扫描过程中耗费的时间
  WSACleanup();  //释放动态连接库并释放被创建的套接字
  return 1;
}
 
int main()
{
  scant("127.0.0.1", 75, 100);
   
  return 0;
}

第三、多线程实现方式

由于单线程执行速度有些慢,我们加入多线程运行,

typedef struct _tagValue
{
  int start;
  int end;
}PortNums;
 
void _cdecl beginThreadFunc1(LPVOID lpParam) {
  PortNums *pnInt = (PortNums*)lpParam;
  scan("127.0.0.1", pnInt->start, pnInt->end);
}
 
int a()
{
  PortNums m1;
  m1.start = 70;
  m1.end = 500;
 
  PortNums m2;
  m2.start = 501;
  m2.end = 1000;
 
  _beginthread(beginThreadFunc1, 0, &m1);
  _beginthread(beginThreadFunc1, 0, &m2);
 
 
  getchar();
  return 0;
}

注意需要#include<process.h>

以上这篇c++ 端口扫描程序实现案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

C++广播通信实例

这篇文章主要介绍了C++实现广播通信的方法,实例讲述了C++ socket广播通信的原理与实现方法,需要的朋友可以参考下
收藏 0 赞 0 分享

C++计算ICMP头的校验和实例

这篇文章主要介绍了C++计算ICMP头的校验和的方法,代码简单实用,对于校验ICMP报文来说有不错的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++设置超时时间的简单实现方法

这篇文章主要介绍了C++设置超时时间的简单实现方法,涉及系统函数setsockopt对套接口的操作,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++实现ping程序实例

这篇文章主要介绍了C++实现ping程序实例,涉及C++对于ICMP数据包的发送与回显处理,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之boost::array的用法

这篇文章主要介绍了C++之boost::array的用法,以实例的形式简单讲述了静态数组的容器boost::array的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之Boost::array用法简介

这篇文章主要介绍了C++之Boost::array用法简介,较为详细的分析了Boost::array中的常见用法,并用实例的形式予以总结归纳,需要的朋友可以参考下
收藏 0 赞 0 分享

VC文件目录常见操作实例汇总

这篇文章主要介绍了VC文件目录常见操作实例汇总,总结了VC针对文件目录的各种常用操作,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

VC打印word,excel文本文件的方法

这篇文章主要介绍了VC打印word,excel文本文件的方法,是VC操作文本文件中非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC++获得当前进程运行目录的方法

这篇文章主要介绍了VC++获得当前进程运行目录的方法,可通过系统函数实现该功能,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC中SendMessage和PostMessage的区别

这篇文章主要介绍了VC中SendMessage和PostMessage的区别,较为全面的分析了SendMessage和PostMessage运行原理及用法上的不同之处,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多