版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、四川大學計學院、軟件學院實驗報告課程名 稱信息安全產(chǎn)品開發(fā)實踐實驗課 時5實驗項 目并發(fā)服務器II 多 線程實驗時 間2013.10.25實驗目 的1)繼續(xù)了解Linux下C語言程序開發(fā)的過程2)了解線程庫Pthreads及提供的基本線程的操作線程的屬性,了解線 程的屬性,線程的互斥和同步3)掌握多線程網(wǎng)絡服務器模型4)能在Linux環(huán)境實現(xiàn)TCP多線程并發(fā)服務器模型5)能編寫多線程端口掃描程序實驗環(huán) 境X86 ,WindowsXP , VMware Workstation5.0.0, RedHat Linux,SSHSecureShellClie nt-3.2.9專業(yè):學號:11431111
2、72 姓名:_柴承訓軟件工程班級:9班第7 周試驗題目1修改遠程控制程序服務器程序,將其從循環(huán)模式或多進程模式修改為多 線程模式試驗題目2多線程端口掃描程序 實現(xiàn)一個多線程端口掃描程序: 要求:1.2.3.實容法能同時掃描5個IP地址;針對每個iP地址,開設100個線程對其進行掃描; 如果端口打開,使用函數(shù)getservb yp ort獲取其服務名, 在屏幕上打?。篒P port servername,如果是未知服務,則屏幕顯示:ip port unkonown序、步驟 和方法)實驗一:先來回顧一下上次實驗實現(xiàn)的多進程并發(fā)服務器:Unix下的大多數(shù)網(wǎng)絡服務器程序都是這么編寫的,即父進程接受連接
3、, 派生子進程,子進程處理與客戶的交互。雖然這種模型很多年來使用得很好,但是fork時有一些問題:(1)fork是昂貴的。內(nèi)存映像要從父進程拷貝到子進程,所有描述字要 在子進程中復制等等。目前有的 Unix實現(xiàn)使用一種叫做寫時拷貝(copy onwrite )的技術,可避免父進程數(shù)據(jù)空間向子進程的拷貝。盡管有 這種優(yōu)化技術,fork仍然是昂貴的;(2)fork子進程后,需要用進程間通信(IPC)在父子進程之間傳遞信 息。Fork之前的信息容易傳遞,因為子進程從一開始就有父進程數(shù)據(jù)空 間及所有描述字的拷貝。但是從子進程返回信息給父進程需要做更多的工作。而上述兩個問題可以通過用線程代替進程的方法來
4、克服,接下來我們再來 看下進程的一些特點:?線程有助于解決這兩個問題。線程有時被稱為輕權進程(lightweight process ),因為線程比進程“輕權”,一般來說, 創(chuàng)建一個線程要比創(chuàng)建一個進程快 10100倍。? 一個進程中的所有線程共享相同的全局內(nèi)存,這使得線程很容易共享信息,但是這種簡易性也帶來了同步問題。? 一個進程中的所有線程不僅共享全局變量,而且共享:進程指令、 大多數(shù)數(shù)據(jù)、打開的文件(如描述字)、信號處理程序和信號處置、 當前工作目錄、用戶ID和組ID。?但是每個線程有自己的線程ID、寄存器集合(包括程序計數(shù)器和 棧指針)、棧(用于存放局部變量和返回地址)、error、信
5、號掩碼、優(yōu)先級。?程序的編譯gcc - o test test.c -Ipthread有了這些理論準備之后我們就可以編程來實現(xiàn)我們的多線程并發(fā)服務器 了。源代碼:/*: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聲明線程處理函數(shù)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)/調用線程函數(shù)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; /線程函數(shù)的實現(xiàn)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):根據(jù)用戶的輸入結果,根據(jù)IP地址創(chuàng)建100線程進行掃描1.創(chuàng)建100個線程描述符p idthread_t * thread;thread = ( pthread_t * )malloc( THREAD_NUM * sizeof( pthread_t);2.為每個線程創(chuàng)建掃描的分工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;:創(chuàng)建線程,開始掃描if(Pthread_create(&threadi.NULL, scan, (void *)&port) !=0 )free(thread);(4):釋
20、放創(chuàng)建的資源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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國發(fā)酵蟲草菌粉市場調查研究報告
- 2025至2030年中國聚丙烯薄膜介質電容器數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國施工錐形路標數(shù)據(jù)監(jiān)測研究報告
- 二零二五年度個人短期信用擔保貸款合同
- 二零二五年度私家車借用及安全責任協(xié)議3篇
- 二零二五年度二手車買賣合同書(含車輛交易糾紛解決機制)
- 二零二五年度離婚協(xié)議書:婚姻解除與經(jīng)濟補償3篇
- 二零二五版水電安裝分包合同模板(含驗收標準)3篇
- 二零二五版水電工程招投標文件編制與審查合同3篇
- 2025版電商促銷活動宣傳品制作合同2篇
- 江蘇省無錫市2023-2024學年八年級上學期期末數(shù)學試題(原卷版)
- 2024年全國統(tǒng)一高考數(shù)學試卷(新高考Ⅱ)含答案
- 繪本《汪汪的生日派對》
- 分手的協(xié)議書模板(5篇)
- 助產(chǎn)護理畢業(yè)論文
- 地震工程學概論課件
- 小學語文三年級下冊生字偏旁、拼音、組詞
- 紡織廠各工種考核細則
- (3篇)工會換屆主持詞
- 機房溫濕度標準要求(設計要求方案)
- 高考英語3500詞匯大綱詞形轉換匯總
評論
0/150
提交評論