Chinaunix首页 | 论坛 | 博客
  • 博客访问: 407694
  • 博文数量: 62
  • 博客积分: 1483
  • 博客等级: 上尉
  • 技术积分: 779
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-24 12:25
文章分类

全部博文(62)

文章存档

2012年(2)

2011年(6)

2010年(6)

2009年(48)

我的朋友

分类: LINUX

2009-11-14 10:35:22

http://blog.chinaunix.net/u/3063/

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define MAX_PORT        4000
#define MAX_THREAD      100
/* basename(argv[0]). netBSD,linux and gnu libc all define it. */
extern char *__progname;

/* globals */
int port_num,thread_num=100;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int main(int argc,char **argv)
{
        void *thread_main(void *);
        pthread_t tid;

#ifndef HAVE__PROGNAME
__progname = argv[0];
#endif
        printf("----kf_701 scan tool--------- \n");

        if(argc != 2){
                fprintf(stderr,"*  Usage: %s host \n",__progname);
                exit(0);
        }

        /* create threads */
        int i;
        for(i=0;i                pthread_create(&tid,NULL,&thread_main,argv[1]);
        /* main pause */
        for( ; ; )
                pause();
}

void *thread_main(void *arg)
{
        struct sockaddr_in sa;
        struct hostent *host;
        int i,sockfd;

        pthread_detach(pthread_self());

        /* init sockaddr_in struct */
        memset(&sa,0,sizeof(struct sockaddr));
        sa.sin_family = AF_INET;
        if(inet_pton(AF_INET,(char *)arg,&sa.sin_addr) == 0){
                host = gethostbyname((char *)arg);
                if(host == NULL){
                        fprintf(stderr,"Hostname Error: %s ",hstrerror(h_errno));
                        exit(1);
                }
                sa.sin_addr = *(struct in_addr *)(host->h_addr_list[0]);
        }

  while(1){
        /* get a port number */
        if(pthread_mutex_lock(&mutex) != 0) exit(1);
        if(++port_num > MAX_PORT){
                if(pthread_mutex_unlock(&mutex) != 0) exit(1);
                if(--thread_num == 0){
                        printf("----------------------------- \n");
                        exit(0);
                }
                pthread_exit(NULL);
        }
        i=port_num;
        if(pthread_mutex_unlock(&mutex) != 0) exit(1);
        /* try to connect */
        sa.sin_port=htons(i);
        sockfd = socket(AF_INET,SOCK_STREAM,0);
        if(sockfd < 0)
                perror("Create socket error"),exit(1);
        if(connect(sockfd,(struct sockaddr *)&sa,sizeof(sa)) == 0)
                printf("* port %4d is open \n",i);
        if(close(sockfd) < 0)
                perror("shutdown error"),exit(1);
  }/*end while*/
}

总结:程序分成100个线程,每个线程通过pthread_mutex_lock取得
     一个端口号,去扫描。100个线程取端口号的时间不是最多的,扫
     描的时间花费的比较多,扫描自己的机器比较快,别人的稍微慢
     些。
SOCK_STREAM扫描到的是tcp端口号。
阅读(1491) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~