资源描述:
《linux系统下实现多线程客户-服务器》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Linux系统下实现多线程客户/服务器 在传统的Unix模型中,当一个进程需要由另一个实体执行某件事时,该进程派生(fork)一个子进程,让子进程去进行处理。Unix下的大多数网络服务器程序都是这么编写的,即父进程接受连接,派生子进程,子进程处理与客户的交互。 虽然这种模型很多年来使用得很好,但是fork时有一些问题: 1.fork是昂贵的。内存映像要从父进程拷贝到子进程,所有描述字要在子进程中复制等等。目前有的Unix实现使用一种叫做写时拷贝(copy-on-ain函数返回或者任何线程调用了exit,进程将终止,线程将随之终止。 以下给出一个使用线程的TCP回射客户/服务器的
2、例子,完成的功能是客户端使用线程给服务器发从标准输入得到的字符,并在主线程中将从服务器端返回的字符显示到标准输出,服务器端将客户端发来的数据原样返回给客户端,每一个客户在服务器上对应一个线程。利用该程序框架,通过扩展客户端和服务器端的处理功能,可以完成多种基于多线程的客户机/服务器程序。该程序在RedHat6.0和TurboLinux4.02下调试通过。共用头文件如下:(head.h)#include#include#include#include#include#i12下一页....,。nclude#include#include#include#include#include#de
3、fineMAXLINE1024#defineSERV_PORT8000#defineLISTENQ1024staticintsockfd;staticFILE*fp; 公用函数如下(mon.c):/*从一个描述字读文本行*/ssize_treadline(intfd,void*vptr,size_tmaxlen){ssize_tn,rc;charc,*ptr;for(n=1;n0){if((non.c;/*在str_cli中定义的要被线程执行的函数*/void*copyto(void*arg){charsendline[MAXLINE];ain(intargc,char**argv)
4、{intsockfd;structsockaddr_inservaddr;if(argc!=2)printf(usage:tcpcli);exit(0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_I;servaddr.sinport=htons(SERV_PORT);i_pton(AF_I,argv[1],&servaddr.sin_addr);connect(sockfd,(structsockaddr*)&servaddr,siziof(servaddr));str_cli(stdin,sockfd);exit
5、(0);} 服务器端主程序如下:#includehead.h;#includemon.c;voidstr_echo(intsockfd){ssize_tn;charline[MAXLINE];for(;;){if((n=readline(sockfd,line,MAXLINE))==0)return;ain(intargc,char**argv){intlistenfd,connfd;socklen_taddrlen,len;structsockaddr_incliaddr,servaddr;pthread_ttid;listenfd=socket(AF_I,SOCK_STREAM,
6、0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_I;servaddr.sin_addr.s_addr=htonl(INADDR_ANY);servaddr.sin_port=SERV_PORT;bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr));listen(listenfd,LISTENQ);addrlen=sizeof(cliaddr);cliaddr=malloc(addrlen);for(;;){len=addrlen;connfd=acce
7、pt(listenfd,(structsockaddr*)&cliaddr,&len);pthread_creat(&tid,NULL,&doit,(void*)connfd);}}上一页12....,。