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

 更新时间:2017年05月16日 08:08:59   投稿:jingxian  
下面小编就为大家带来一篇c++ 端口扫描程序实现案例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

第一、原理

端口扫描的原理很简单,就是建立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++快速排序及优化方案详解,快速排序是一种常用的排序算法,它通过选择一个基准元素,将数组分成两个子数组,其中一个子数组的所有元素都小于基准元素,另一个子数组的所有元素都大于基准元素,需要的朋友可以参考下
    2023-10-10
  • Qt+FFMPEG实现循环解码详解

    Qt+FFMPEG实现循环解码详解

    这篇文章主要为大家详细介绍了如何利用Qt+FFMPEG实现循环解码功能,文中的示例代码讲解详细,对我们学习Qt有一定帮助,需要的可以参考一下
    2022-08-08
  • C++ 二叉树的实现超详细解析

    C++ 二叉树的实现超详细解析

    二叉树可以简单理解为对于一个节点来说,最多拥有一个上级节点,同时最多具备左右两个下级节点的数据结构。本文将详细介绍一下C++中二叉树的实现和遍历,需要的可以参考一下
    2022-03-03
  • C语言动态链表实现学生学籍管理系统

    C语言动态链表实现学生学籍管理系统

    这篇文章主要为大家详细介绍了C语言动态链表实现学生学籍管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • C++17使用折叠表达式实现一个IsAllTrue函数的过程

    C++17使用折叠表达式实现一个IsAllTrue函数的过程

    本文介绍了利用C++17特性实现IsAllTrue函数的方法,详细讲解了从基于初始化列表的初级版本到使用折叠表达式和类型萃取的高级优化版本,需要的朋友参考下吧
    2024-09-09
  • 基于C语言实现的扫雷游戏代码

    基于C语言实现的扫雷游戏代码

    这篇文章主要介绍了基于C语言实现的扫雷游戏代码,对于学习游戏开发的朋友有一定的借鉴价值,需要的朋友可以参考下
    2014-08-08
  • C语言中的运算符和结合性问题

    C语言中的运算符和结合性问题

    这篇文章主要介绍了C语言中的运算符和结合性问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • C语言浮点函数中的modf和fmod详解

    C语言浮点函数中的modf和fmod详解

    这篇文章主要为大家详细介绍了C语言浮点函数中的modf和fmod,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++中std::chrono时间库的全面解析

    C++中std::chrono时间库的全面解析

    C++ std::chrono时间库是C++标准库提供的一个时间处理库,提供了一个方便、灵活和精确的时间处理工具,下面小编就带大家深入了解一下std::chrono时间库的使用吧
    2023-10-10
  • C++设计模式编程中的迭代器模式应用解析

    C++设计模式编程中的迭代器模式应用解析

    这篇文章主要介绍了C++设计模式编程中的迭代器模式应用解析,迭代器模式注重对集合中元素的遍历而不使其暴露,需要的朋友可以参考下
    2016-03-03

最新评论