📄 pthread_scan.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 + -