⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pthread_scan.c

📁 多线程扫描
💻 C
字号:
#include <pthread.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/socket.h>
#include<netdb.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>

#define IP_NUM        5 // the number of the ip to scan
#define MAX_PORT     5000 // the max port number
#define THREAD_NUM 100 // the thread number
#define SEG_LEN        100 // the segment between min_port and max_port

typedef struct port_segment {
    struct in_addr dest;
    unsigned int min_port;
    unsigned int max_port;
} port_segment;

int do_scan( struct sockaddr_in dest_addr )
{
    int sockfd;
    struct servent  *serv;

    if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
        perror( "socket failed" );


    if ( connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)) < 0 ) {
        close( sockfd );
        return -1;
    }
    else 
        {

             serv = ( struct servent  *)getservbyport(dest_addr.sin_port,NULL);
			 if(NULL !=serv){
				printf("port: %d  name: %s\n",ntohs(dest_addr.sin_port),serv->s_name);
			}
             else{
                 printf("unknown\n");
			}
        }
		

    return 1;
}




void *scan( void *arg )
{
    port_segment port;
    struct sockaddr_in dest_addr;


    memcpy( &port, arg, sizeof(struct port_segment) );

    memset( &dest_addr, 0, sizeof(struct sockaddr_in) );
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_addr.s_addr = port.dest.s_addr;

    int i;

    for (  i = port.min_port; i <= port.max_port; ++i ) {
        dest_addr.sin_port = htons( i );


        if ( do_scan(dest_addr) < 0 )
            continue;
    }

    return NULL;
}

int main( int argc, char *argv[] )
{
    pthread_t *thread;
    struct in_addr dest_ip[ IP_NUM ]; // IP_NUM ip address


    if ( argc < 2 ) {
        fprintf( stderr, "usage: ./scan [ip1] [ip2] .. [ip5]\n" );
        exit ( 0 );
    }

    int i;
    for (  i = 1; i < argc; ++i ) {
        if ( inet_aton(argv[i], &dest_ip[i - 1]) == 0 ) {
            fprintf( stderr, "invalid ip address.\n" );
            exit ( 0);
        }
    }


    thread = ( pthread_t * )malloc( THREAD_NUM * sizeof(pthread_t) );
    int a;
    int b;
    for (  a = 0; a < argc - 1; ++a ) {
        for (  b = 0; b < THREAD_NUM; ++b ) {
            port_segment port;
            port.dest = dest_ip[ a ];
            port.min_port = b * SEG_LEN + 1;
            if ( b == (THREAD_NUM - 1) )
                port.max_port = MAX_PORT;
            else
                port.max_port = port.min_port + SEG_LEN - 1;
            if ( pthread_create(&thread[b], NULL, scan, (void *)&port) != 0 )
               perror( "pthread_create failed" );
			pthread_join( thread[b], NULL );
        }
    }


    free( thread );

    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -