linux系统下实现多线程客户-服务器

linux系统下实现多线程客户-服务器

ID:9497768

大小:60.00 KB

页数:5页

时间:2018-05-01

linux系统下实现多线程客户-服务器_第1页
linux系统下实现多线程客户-服务器_第2页
linux系统下实现多线程客户-服务器_第3页
linux系统下实现多线程客户-服务器_第4页
linux系统下实现多线程客户-服务器_第5页
资源描述:

《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....,。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。