美文网首页
C语言实现TCP多线程端口扫描

C语言实现TCP多线程端口扫描

作者: 乱七八糟的心情 | 来源:发表于2018-11-09 10:17 被阅读0次

多线程端口扫描实现(C语言)

  1. 源码:
#include <winsock2.h>
#include <stdio.h>
#include <Windows.h>
#include <ws2tcpip.h>
#include <time.h>
#pragma comment(lib,"WS2_32.lib")
DWORD WINAPI ScanThread (LPVOID port);

int main (int argc, char* argv[])
{
    WSADATA  wsd;
    int port = 0;
    int MAX_PORT;
    clock_t start, end;
    HANDLE handle;
    DWORD dwThreadId;
    //Initialize socket lib
    if (WSAStartup (MAKEWORD (2, 2), &wsd) != 0)
    {
        printf ("WSAStartup failed!\n");
        return 1;
    }
    printf ("请输入要扫描的最大端口:");
    scanf ("%d", &MAX_PORT);
    printf("Scaning......\n");
    start = clock ();
    //扫描的主要代码,根据需要删减
    do{
        handle = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)ScanThread, (LPVOID)port, 0, &dwThreadId);
        port++;
    } while (port < MAX_PORT);
    WaitForSingleObject (handle, INFINITE);//等待最后一个线程结束
    end = clock ();
    int duration = end - start;
    printf ("总耗时 %d ms", duration);
    system ("pause");
    return 0;
}

DWORD WINAPI ScanThread (LPVOID port)
{
    int Port = (int)(LPVOID)port;
    int retval;//调用各种socket函数的返回值
    SOCKET sHost;
    SOCKADDR_IN servAddr;
    sHost = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (INVALID_SOCKET == sHost)
    {
        printf ("socket failed!\n");
        WSACleanup ();
        return -1;
    }
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.S_un.S_addr = inet_addr ("127.0.0.1");
    //setsockopt (sHost, IPPROTO_TCP, TCP_MAXRT, (char *)&Timeout, sizeof (Timeout));//设置快速扫描
    servAddr.sin_port = htons (Port);
    retval = connect (sHost, (LPSOCKADDR)&servAddr, sizeof (servAddr));//lpsockaddr is 环路地址
    if (retval == SOCKET_ERROR) {
        printf ("端口%d关闭!\n", Port);  //这里不要使用WSACleanup()函数,不然后续的线程会创建不了socket
        closesocket (sHost);
        return -1;
    }
    printf ("端口%d开放!\n", Port);
    closesocket (sHost);
    return 1;
}

  1. 可以在ScanThread线程函数中设置server的IP来确定要扫描的主机,运行时会提示输入扫描的最大端口。
提示.png
  1. 调用time.h中的clock函数来精确确定扫描的时间,在end之前调用WaitForSingleObject函数等待最后一个线程扫描结束。
定义start,end时钟
调用WaitForSingleObject
  1. 测试结果:
  • 扫描本地:
本地耗时1265ms
  • 扫描百度(123.125.115.110):
扫描百度耗时21262ms

C语言计时函数

相关文章

  • C语言实现TCP多线程端口扫描

    多线程端口扫描实现(C语言) 源码: 可以在ScanThread线程函数中设置server的IP来确定要扫描的主机...

  • swoole日记

    PHP的协程高性能网络通信引擎,使用C/C++语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络...

  • 0x02 主动信息收集

    查看端口扫描模块 tcp端口扫描 tcp协议同步SYN扫描 nmap扫描 arp sweep udp sweepe...

  • 2.端口扫描

    udp 端口扫描 nmap -sU 192.168.1.17 -p-tcp 端口扫描 syn 隐蔽端口扫描(建立不...

  • Linux下基于C++的TCP连接demo代码分享(C++,Li

    #C++实现TCP连接 @(C++代码)[网络编程, tcp, C++, C++实现] server.cpp: #...

  • 学习总结-GDC

    多线程(GCD) 一.实现方式 pthread: C语言实现,不常用 nsthred: 基本上也不用 gcd: 常...

  • python3多线程端口扫描

    python3多线程端口扫描

  • iOS多线程

    多线程 iOS中的多线程创建方式可以分为四类实现方式: pthread基于C语言,基本不使用。 NSThread基...

  • pthread多线程(C语言) + Socket

    pthread多线程(C语言) + Socket pthread是使用使用C语言编写的多线程的API, 简称Pth...

  • 多线程的方法

    多线程分为GCD,NSOperation和NSThread。GCD底层是用C语言实现的,NSOperation是对...

网友评论

      本文标题:C语言实现TCP多线程端口扫描

      本文链接:https://www.haomeiwen.com/subject/vpynxqtx.html