首页 > 其他分享 >unix并发技术的学习及在扫描器上的应用二

unix并发技术的学习及在扫描器上的应用二

时间:2023-04-09 22:08:17浏览次数:33  
标签:扫描器 int ip char 并发 unix 线程 pthread include


unix并发技术的学习及在扫描器上的应用二

上一篇并发技术说的是多进程,本来想在那的基础上加进进程间同步和通信,不过暂时还没有掌握到,只能换成多线程来做rp了.

第一部分--基础知识
一.线程概念:

 线程是提高代码响应和性能的绝好的手段,其由内核按时间分片进行管理.进程可含多线程,线程间共享内存空间.节省cup时间,减少系统开销.不过要考虑同步问题.

二.相关函数:

1.pthread_create()
pthread_create创建线程
原型为:
#include<pthread.h>
extern int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
第一个参数为指向线程标识符的指针
第二个参数用来设置线程属性
第三个参数是线程运行函数的起始地址
最后一个参数是运行函数的参数。

如函数start_routine不需要参数,所以最后一个参数设为空指针。
第二个参数为空指针,这样将生成默认属性的线程。

当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。
前者表示系统限制创建新的线程,例如线程数目过多了;
后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码.

2.pthread_join()
pthread_join等待线程结束
原型为:
#include<pthread.h>
int pthread_join (pthread_t thread, void **value_ptr));
第一个参数为被等待的线程标识符
第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。

这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回.

3.pthread_exit()
pthread_exit退出线程.
原型为:
#include<pthread.h>
extern void pthread_exit(void *value_ptr);
value_ptr参数指向线程退出状态.
无返回值.
  
第二部分--多线程80banner扫描器的具体实现  

一.思路:

1.多ip处理模块(利用二进制方法处理)
处理一个子网ip(vlsm).
转换ip
unsigned long convert_ip(const char *t_addr);
增加掩码
unsinged long add_masking(const char *t_addr,int mask);
转换成整数
char *reverse_int(unsigned long addr);

2.usage提示模块
int usage(char *pro)
{
printf("pthread 80 banner scanner");
printf("input subnet ip");
printf("usage:%s ip/27 /n",pro);
}

3.扫描模块
viod scanip(char sip[20])

4.多进程及处理模块
pthread()

二.实现

/********************************************************************
**pthread 80 banner scanner ver1.0
*
*to complie:
*user$gcc -o 80scaner 80scanner.c
*
*to use:
*user$./80scanner ip/27 (the best input subnet ip otherwise *waste too many system resource )
*
*coded by nightcat
*july 2003*********************************************************************/
/*所要的头文件*/
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#define  BUF_SIZE  20/*声明函数*/
int usage(char *pro);
void scanip(char sip[20]);
unsigned long convert_ip(const char *t_addr);
unsinged long add_masking(const char *t_addr,int mask);
char *reverse_int(unsigned long addr);int main(int argc ,char* argv[])
{
 pthread_t pth;
 int count;
 char scan_ip[20];
        char *network,*mask;/*输入参数判断*/
if(argc!=2)
 {
    usage(argv[0]);
    exit(1);
    }
    /*处理ip*/  
  network=strtok(agrv[1],"/");
  mask=strtok(NULL,"/");
  
  start=convert_ip(network);
  end=add_masking(network,atoi(mask));  
/*循环扫描*/
   for(count=start;count<=end;count++)
 {
       scan_ip=reverse_int(count);
    /*产生线程*/
    if(pthread_create(&pth,null,scanip,scan_ip))
     { 
        perror("pthread_create error/n");
     exit(1);
        }
         
    }
 
 return(0);
}/*用法函数*/
int  usage(char *pro)
 {
        printf("pthread 80 banner scanner/n");
        printf("input subnet ip");
        printf("usage:%s ip/27 /n",pro);
        }/*扫描函数*/
void scanip(char sip[20])
 {
  struct sockaddr_in addr;
  int s;
  char buffer[1024];
  if((s=socket(AF_INET,SOCK_STREAM,0))<0){
   perror("socket error/n");
   exit(1);
   }
  addr.sin_family=AF_INET;
  addr.sin_addr.s_addr=inet_addr(sip);
  addr.sin_port=htons(80);
  if(connect(s,(struct sockaddr *)&addr,sizeof(addr))<0){
   perror("connect error");
   exit(1);
   }
  send(s,"HEAD / HTTP/1.0/n/n",17,0);
  recv(s,buffer,sizeof(buffer),0);
  printf("%s's http version:/n%s",sip,buffer);
  close(s);
  pthread_exit(null);
 }
/*转换ip*/
unsigned long convert_ip(const char *t_addr)
{
 int octet1=0;
 int octet2=0;
 int octet3=0;
 int octet4=0;
 if(sscanf(t_addr,"%d.%d.%d.%d",&octet1,&octet2,&octet3,&octet4)<1)
 {
  perror("sscanf error");
 }
 
   return((octet1<<24) | (octet2<<16) |(octet3<<8)|octet4);
}
/*增加掩码*/
unsinged long add_masking(const char *t_addr,int mask)
{
 if(mask >32 || mask <0)
 {
  perror("not a valid subnet mask");
 }
 return((int)pow(2,32-mask)+conert_ip(t_addr)-1);
}
/*转换成整数格式*/
char *reverse_int (unsigned long addr)
{
 static char *buffer[BUF_SIZE];
 snprintf((char *)buffer,BUF_SIZE,"%d.%d.%d.%d",
     (addr & 0xff000000) >> 24,
     (addr & 0x00ff0000) >> 16,
     (addr & 0x0000ff00) >> 8,
     (addr & 0x000000ff));
 return((char *) buffer);
}三总结:
其中新学的东西:
  1.子网ip的处理方法
  2.子网的划分方法
  3.多线程的简单应用
  4.pow函数的应用
  5.位移的应用

标签:扫描器,int,ip,char,并发,unix,线程,pthread,include
From: https://blog.51cto.com/u_1790502/6179209

相关文章

  • unix并发技术的学习及在扫描器上的应用一
    ***条件和时间问题,程序暂时还没进行测试.              unix并发技术的学习及在扫描器上的应用一我一直学着写扫描器.我的一个方向是:多进程--多线程--线程安全(MT-safe).都想在扫描器上实现.现在学习多进程部分.第一部分--基本知识 一.进程概念:进程定义了一计算的......
  • 【Java 并发】【十】【JUC数据结构】【六】SynchronousQueue同步阻塞队列原理
    1 前言看过了LinkedBlockingQueue、ArrayBlockingQueue、DelayQueue等阻塞队列,这节我们又要看一个不一样的队列,SynchronousQueue同步阻塞队列。2 SynchronousQueue是什么SynchronousQueue的同步队列,使用的场景比较少,主要是用来做线程之间的数据同步传输的。线程之间的同步......
  • 【Java 并发】【十】【JUC数据结构】【五】DelayQueue延迟阻塞队列原理
    1 前言前两节我们看了BlockingQueue阻塞队列的两个子类,LinkedBlockingQueue、ArrayBlockingQueue,它们都是使用了ReentrantLock、Condition的来实现的,在进行插入操作、拉取数据操作之前为了并发安全都需要进行加锁;然后插入时候在容量满的时候发现没有空间了,这时候调用Condition.......
  • 【Java 并发】【十】【JUC数据结构】【三】LinkedBlockingQueue阻塞队列原理
    1 前言这节我们就来看看LinkedBlockingQueue内部实现的原理。2 LinkedBlockingQueue的使用在看原理之前我们先来用一用LinkedBlockingQueue,来体验一下:2.1  插入数据publicclassLinkedBlockingQueueTest{publicstaticvoidmain(String[]args)throwsInter......
  • 【Java 并发】【十】【JUC数据结构】【一】CopyOnWriteArrayList原理
    1 前言我们前面看过了volatile、synchronized以及AQS的底层原理,以及基于AQS之上构建的各种并发工具,ReentrantLock、CountDownLatch、Semaphore、CyclicBarrier,那么我们这节该看什么了,是不是要看运用了。在日常的业务编程中经常使用到的内存数据结构有:Map、Set、List、Queue系列......
  • 并发兼容性测试
    Web测试项目中经常进行浏览器兼容性相关的测试工作,因为兼容性测试的工作重复性相当高,所以导致手工测试效率低下测试人员积极性降低。TestNG提供了并发执行测试用例的功能,可以让测试用例以并发的形式执行,实现测试不同浏览器的兼容性测试。下面代码中分别使用Chrome、Firefox和......
  • Lunix常用命令
    ll查看当前目录下的所有文件pwd查看当前位置cd进入某个文件夹wget是Linux系统用于从Web下载文件的命令行工具,支持HTTP、HTTPS及FTP协议下载文件tar压缩加压命令tarxvf解压某个压缩包su切换管理员whereis  which查找文件或文件夹rm删除文件命令./config--p......
  • C++ 并发编程实战 第二章 线程管控
    第二章线程管控std::thread简介构造和析构函数///默认构造///创建一个线程,什么也不做thread()noexcept;///带参构造///创建一个线程,以A为参数执行F函数template<classFn,class...Args>explicitthread(Fn&&F,Args&&...A);///拷贝构造(不可用)thread......
  • 【Java 并发】【九】【AQS】【八】ReentrantReadWriteLock之ReadLock读锁原理
    1 前言上节我们看了下ReentrantReadWriteLock读写锁的写锁的申请和释放过程,这节我们就来看下读锁的。2 线程读锁记录回顾一下之前的例子,在读写并发操作的时候,读取数据的时候加读锁:publicclassReentrantReadWriteLockTest{//声明一个读写锁privatestaticR......
  • MVCC——多版本并发控制
    概念MultiVersionConcurrencyControl,用于数据库的并发访问控制MVCC在mysqlinnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,实现读写冲突不加锁,非阻塞并发读写每一次的数据修改都会将历史记录保存在Undolog里,读数据采用快照读的方式,这......