日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程端口扫描程序

發(fā)布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程端口扫描程序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

要求

實現(xiàn)一個多線程端口掃描程序:
要求:
1、能至少掃描5個IP地址;
2、針對每個iP地址,開設100個線程同時對其進行掃描;
3、如果端口打開,使用函數(shù)getservbyport獲取其服務名,在屏幕上打印:IP port servername,如果是未知服務,則屏幕顯示:ip port unkonown

注意點

  • 注意各種參數(shù)傳遞的類型
  • arg是一個地址,將arg地址復制到&port的時候,arg地址的數(shù)據(jù)已經(jīng)被改變了。
    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掃描結束:%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; }

    總結

    以上是生活随笔為你收集整理的多线程端口扫描程序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。