intpthread_create(pthread_t*tid,constpthread_attr_t*attr,void*(*func)(void*),void*arg);
intpthread_join(pthread_ttid,void**status);
pthread_tpthread_self(void);
intpthread_detach(pthread_ttid);
voidpthread_exit(void*status);
#include#include#include#include#include#include#include#include#include#include#include#defineMAXLINE1024#defineSERV_PORT8000#defineLISTENQ1024staticintsockfd;staticFILE*fp;
/*从一个描述字读文本行*/ssize_treadline(intfd,void*vptr,size_tmaxlen){ssize_tn,rc;charc,*ptr;for(n=1;n0){if((nwritten=write(fd,ptr,nleft))<=0){if(errno==EINTR)nwritten=0;elsereturn(-1);}nleft-=nwritten;ptr++=nwritten;}
#include“head.h";#include“common.c";/*在str_cli中定义的要被线程执行的函数*/void*copyto(void*arg){charsendline[MAXLINE];while(fgets(sendline,MAXLINE,fp)!=NULL)writen(sockfd,sendline,strlen(sendline));shutdown(sockfd,SHUT_WR);return(NULL);}voidstr_cli(FILE*fp_arg,intsockfd_arg){charrecvline[MAXLINE];pthread_ttid;sockfd=sockfd_arg;fp=fp_arg;pthread_creat(&tid,NULL,copyto,NULL);while(readline(sockfd,recvline,MAXLINE)>0)----fputs(recvline,stdout);}intmain(intargc,char**argv){intsockfd;structsockaddr_inservaddr;if(argc!=2)printf(“usage:tcpcli");exit(0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sinport=htons(SERV_PORT);inet_pton(AF_INET,argv[1],&servaddr.sin_addr);connect(sockfd,(structsockaddr*)&servaddr,siziof(servaddr));str_cli(stdin,sockfd);exit(0);}
#include“head.h";#include“common.c";voidstr_echo(intsockfd){ssize_tn;charline[MAXLINE];for(;;){if((n=readline(sockfd,line,MAXLINE))==0)return;writen(sockfd,line,n);}}staticvoid*doit(void*arg){pthread_detach(pthread_self());str_echo((int)arg);close((int)arg);return(NULL);}intmain(intargc,char**argv){intlistenfd,connfd;socklen_taddrlen,len;structsockaddr_incliaddr,servaddr;pthread_ttid;listenfd=socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;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=accept(listenfd,(structsockaddr*)&cliaddr,&len);pthread_creat(&tid,NULL,&doit,(void*)connfd);}}