信息安全产品开发实践-并发服务器II——多线程_第1页
信息安全产品开发实践-并发服务器II——多线程_第2页
信息安全产品开发实践-并发服务器II——多线程_第3页
信息安全产品开发实践-并发服务器II——多线程_第4页
信息安全产品开发实践-并发服务器II——多线程_第5页
已阅读5页,还剩21页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、四川大学计学院、软件学院实验报告课程名 称信息安全产品开发实践实验课 时5实验项 目并发服务器II 多 线程实验时 间2013.10.25实验目 的1)继续了解Linux下C语言程序开发的过程2)了解线程库Pthreads及提供的基本线程的操作线程的属性,了解线 程的属性,线程的互斥和同步3)掌握多线程网络服务器模型4)能在Linux环境实现TCP多线程并发服务器模型5)能编写多线程端口扫描程序实验环 境X86 ,WindowsXP , VMware Workstation5.0.0, RedHat Linux,SSHSecureShellClie nt-3.2.9专业:学号:11431111

2、72 姓名:_柴承训软件工程班级:9班第7 周试验题目1修改远程控制程序服务器程序,将其从循环模式或多进程模式修改为多 线程模式试验题目2多线程端口扫描程序 实现一个多线程端口扫描程序: 要求:1.2.3.实容法能同时扫描5个IP地址;针对每个iP地址,开设100个线程对其进行扫描; 如果端口打开,使用函数getservb yp ort获取其服务名, 在屏幕上打印:IP port servername,如果是未知服务,则屏幕显示:ip port unkonown序、步骤 和方法)实验一:先来回顾一下上次实验实现的多进程并发服务器:Unix下的大多数网络服务器程序都是这么编写的,即父进程接受连接

3、, 派生子进程,子进程处理与客户的交互。虽然这种模型很多年来使用得很好,但是fork时有一些问题:(1)fork是昂贵的。内存映像要从父进程拷贝到子进程,所有描述字要 在子进程中复制等等。目前有的 Unix实现使用一种叫做写时拷贝(copy onwrite )的技术,可避免父进程数据空间向子进程的拷贝。尽管有 这种优化技术,fork仍然是昂贵的;(2)fork子进程后,需要用进程间通信(IPC)在父子进程之间传递信 息。Fork之前的信息容易传递,因为子进程从一开始就有父进程数据空 间及所有描述字的拷贝。但是从子进程返回信息给父进程需要做更多的工作。而上述两个问题可以通过用线程代替进程的方法来

4、克服,接下来我们再来 看下进程的一些特点:?线程有助于解决这两个问题。线程有时被称为轻权进程(lightweight process ),因为线程比进程“轻权”,一般来说, 创建一个线程要比创建一个进程快 10100倍。? 一个进程中的所有线程共享相同的全局内存,这使得线程很容易共享信息,但是这种简易性也带来了同步问题。? 一个进程中的所有线程不仅共享全局变量,而且共享:进程指令、 大多数数据、打开的文件(如描述字)、信号处理程序和信号处置、 当前工作目录、用户ID和组ID。?但是每个线程有自己的线程ID、寄存器集合(包括程序计数器和 栈指针)、栈(用于存放局部变量和返回地址)、error、信

5、号掩码、优先级。?程序的编译gcc - o test test.c -Ipthread有了这些理论准备之后我们就可以编程来实现我们的多线程并发服务器 了。源代码:/*:udp server.c* Descri pti on: This a udp rpc server* Versio n: 1.0* Created: 2013none* Comp iler: gccprogram is used to demostrate how to impiement骞?9 鏈?4 鏃?20 鏃?9 鍒?2 绉? *Revisi on:* Author: Gang Lia ng* Organi zati

6、on: Compu ter Scie nee College, Sichua n Un iverstiy*/#in clude <stdio.h>#in clude <stdlib.h>#in clude <stri ng.h>#in clude vsys/socket.h>#in clude vn et in et/ in .h>#in clude vsys/t yp es.h>#in clude vuni std.h> #i nclude vp thread.h> #in clude varp a/i net.h>#d

7、efi ne PORT 8888#define SIZE 2048/*server port */ /* 2K BUFFER */void * start_routi ne(void* arg); II声明线程处理函数intexec (char* comma nd,char* result)FILE * in; int len; char c;len=0;bzero(result,sizeof(result);in=popen (comma nd,"r");if (NULL=i n)fprin tf(stderr,"error in create a pipen&

8、quot;);return -1; while(c=fgetc(i n) )!=EOF )&&(le nv SIZE) resultle n=c;len+;resultle n='0'p close(i n);if (0=le n)sprin tf(result,"%s cannot executen",comma nd);return len;/*/*end of function exec* Name: main* Descri pti on:*/int main ( int argc, char *argv) int thread;in

9、t sockfd;struct sockaddr in*/struct sockaddr in*/FUNCTIO/* socket */clie nt;/*ip address of clientserver;/*ip address of server*/int len;int port;int rvalue;char sen d_bufSIZE; buffer */char recv_bufSIZE;*/char cmd10;deal with cd comma nd */char path2048;int opt;int conn ected;/*/* the result of/* t

10、he comma nd buffer/i nitsockfd=-1;bzero (&clie nt,sizeof(struct sockaddr); bzero (&server,sizeof(struct sockaddr); le n=-1;rvalue=-1; bzero(se nd_buf,SIZE); bzero(recv_buf,SIZE);p ort=PORT;bzero(cmd,10);bzero( path,2048);op t=SO_REUSEADDR;conn ected=-1;/ p hrase 1: create socket; sockfd=sock

11、et(AF_INET,SOCK_STREAM,0); socket */if (-1=sockfd)fprin tf(stderr,"error in creati ng socket'n"); exit(-1);these two var used to/* gen erate thesetsocko pt(sockfd,S 0SOCKET,SO_REUSEADDR,&op t,sizeof(o pt);/p hrase 2: bind the socketserver.sin_family=AF_INET;server.s in_p ort=ht ons

12、(p ort); server.sin_addr.s_addr=hto nl(INADDR_AN Y);rvalue=bi nd(sockfd,(struct sockaddr);sockaddr* )& server,sizeof(structif (-1=rvalue)fprin tf(stderr,"error in binding socketn"); close(sockfd);exit(-1);/liste n socketif (-1=liste n(sockfd,10)p error("liste n socket error'n&

13、quot;); close(sockfd);return -1;/p hraseto server first,the n the server/can send message to the client.Otherwise, clie nt3: com muni cati on with clie nt.Atte ntio n:Thewhile(1)len=sizeof(struct sockaddr);if (-1=(connected=accept(sockfd,(struct p error("three shakeha nds errorn"); close(s

14、ockfd);return -1;clie nt send messageserver cannot konw about thesockaddr*)&clie nt,&len)/调用线程函数if (p thread_create(&thread, NULL, (void *)start_routi ne, (void *)c onn ected)p error("Pthread_create() error");exit(1);close(c onn ected); /p hrase 4:release the socket close(sockf

15、d);return EXIT_SUCCESS; /线程函数的实现void* start_routi ne(void* arg) int conn _sock = arg;int sockfd;char sen dbufSIZE; char recvbufSIZE; int sendnum;int recv num;int len gth;int opt;int cnt;while(1)close(sockfd); memset(recvbuf,O,SIZE); memset(se ndbuf,O,SIZE);if (0>=(recv nu m=read(c onn _sock,recvb

16、uf,SIZE) p error("the commucati on error' n");/*aga inn");close(c onn _sock); close(sockfd); return -1;recvbufrecv nu m='0:fprin tf(stderr,"the comma nd is:%sn",recvbuf);if (0=strcm p(recvbuf,"quit") fpr in tf(stderr,"the clie nt is quitn"); close

17、(c onn _sock);break;if (1>=(c nt=exec(recvbuf,se ndbuf) sprin tf(se ndbuf,"thein validcomma nd,pl easetryfprin tf(stderr,"the result is n %s",se ndbuf);if (0>=(sendnum=write(conn_sock,sendbuf,strlen(sendbuf) p error("the commucati on errorn");close(c onn _sock);return

18、-1;close(sockfd);end of function main实验截图:*/实验思路;主要分为以下四个部分:(1):从控制端接受用户的输入;(2):根据用户的输入结果,根据IP地址创建100线程进行扫描1.创建100个线程描述符p idthread_t * thread;thread = ( pthread_t * )malloc( THREAD_NUM * sizeof( pthread_t);2.为每个线程创建扫描的分工for ( int j = 0; j < argc - 1; +j ) for ( int i = 0; i < THREAD_NUM; +i )

19、po rt_segme nt port;p ort.dest = dest_i p j ;p ort.min_port = i * SEG_LEN + 1;/* the last segme nt */if ( i = (THREAD_NUM - 1)p ort.max_port = MAX_P ORT;elsepo rt.max_ port = p ort.min _port + SEG_LEN - 1;:创建线程,开始扫描if(Pthread_create(&threadi.NULL, scan, (void *)&port) !=0 )free(thread);(4):释

20、放创建的资源free( pthread);源代码:p error(” pthread_create failed'n");exit(-2);#in cludevstdiib.h#in clude<stdio.h>#in cludevsys/socket.h#in clude vn etdb.h>#in cludevstri ng.h>#in cludev uni std.h>#in clude vn eti net/in .h>#in cludevar pa/in et.h>#i nclude vp thread.h>#defi

21、 ne NUM 100#defi ne MAX_PORT 65535#defi ne SEG_LEN 655typ edef struct po rt_segme ntint *ip;un sig ned min_p ort;un sig ned max_p ort;po rt_segme nt;void *sca n( void*arg);int main (i nt argc, char *argv)int j, i;p thread_t *thread;thread = (p thread_t *)malloc(NUM*sizeof( pthread_t);if(argcv2)|(arg

22、c>6) prin tf("i nput error!' n");for(j = 1; j < argc; j+)for(i = 0; i < NUM; i+)*portpo rt_segme nt*)malloc(sizeof( po rt_segme nt);p ort- >ip=argvj;p ort->min _port = i*SEG_LEN +1;if(i = (NUM -1)p ort->max_ port = MAX_PORT;elsep ort->max_ port = p ort-> min_p ort + SEG_LEN -1;if(p thread_creat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论