美文网首页
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多线程端口扫描

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