多线程端口扫描程序
要求
實現(xiàn)一個多線程端口掃描程序:
要求:
1、能至少掃描5個IP地址;
2、針對每個iP地址,開設(shè)100個線程同時對其進行掃描;
3、如果端口打開,使用函數(shù)getservbyport獲取其服務(wù)名,在屏幕上打印:IP port servername,如果是未知服務(wù),則屏幕顯示:ip port unkonown
注意點
memcpy( &port, arg, sizeof(struct port_segment) );
解決方法:創(chuàng)建100個線程就創(chuàng)建100個傳過來的參數(shù),每個線程傳遞不同的參數(shù)地址
代碼
#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> #include <printf.h> #include <sys/wait.h> #include <sys/types.h>#define THREAD_NUM 100void print_usage(char * cmd) {fprintf(stderr," %s usage:\n",cmd);fprintf(stderr,"%s IP_Addr \n",cmd); }typedef struct port_segment {struct in_addr dest;unsigned int min_port;unsigned int max_port; } port_segment;int is_connect(int port, in_addr_t addr) {int sockfd;struct sockaddr_in server;int ret;int stat = 1;sockfd=socket(AF_INET,SOCK_STREAM,0);if (-1==sockfd){perror("can not create socket\n");exit(-1);}memset(&server,0,sizeof(struct sockaddr_in));server.sin_family = AF_INET;server.sin_addr.s_addr = addr;server.sin_port = htons(port);ret=connect(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr));close(sockfd);if(ret<0){return 0;}else{return 1;}}void *scan_port( void *arg ) {port_segment port;memcpy( &port, arg, sizeof(struct port_segment) );int start_port = port.min_port;int end_port = port.max_port;//printf("開始端口:%d\n",start_port);struct servent *servent_pointer; for(; start_port<= end_port ; start_port++ ){ if(is_connect(start_port,port.dest.s_addr) ){servent_pointer = getservbyport(htons(start_port),NULL);if(servent_pointer != NULL){printf("%d\t%s\n",start_port,servent_pointer->s_name); }else{printf("%d\tunkown\n",start_port);}}}}void scan_ip(char *ip) { printf("開始掃描IP:%s\n",ip);pthread_t *thread;thread = ( pthread_t * )malloc( THREAD_NUM * sizeof(pthread_t) );port_segment port[THREAD_NUM];int i =0;for (i = 0;i<THREAD_NUM; i++){ port[i].dest.s_addr = inet_addr(ip);port[i].min_port = i*655+1;if ( i == (THREAD_NUM - 1) ){port[i].max_port = 65535;}else{port[i].max_port = port[i].min_port + 655 - 1;}if ( pthread_create(&thread[i], NULL, scan_port, (void *)&port[i]) != 0 ){perror( "pthread_create failed\n" );free(thread);exit(-2);}}for(i=0;i<THREAD_NUM;i++){pthread_join(thread[i], NULL); }printf("IP掃描結(jié)束:%s\n",ip);}int main( int argc, char *argv[] ) {if (1 == argc){print_usage(argv[0]);}int i = 1 ;for(i=1;i<argc;i++){ scan_ip(argv[i]);}return 0; }總結(jié)
- 上一篇: onlyoffice 自动保存_leaf
- 下一篇: 关于Eureka的自我保护模式