else if(recvlen<0){
close(connectfd);
printf(\ return; }
client_name[recvlen]='\\0';
printf(\ bzero(recvbuf,100);
while(recvlen=recv(connectfd,recvbuf,MAXCHARSIZE,0)){ recvbuf[recvlen]='\\0';
printf(\ for(i=0;i send(connectfd,sendbuf,strlen(sendbuf),0); bzero(recvbuf,100); } /*while*/ printf(\ close(connectfd); } void *start_routine(void *arg) { struct ARG *info; info = (struct ARG *)arg; process_client(info -> connfd, info -> client); free(arg); pthread_exit(NULL); } 21 实验五 线程专用数据TSD实现 参考源代码: 客户端程序如下: #include #define MAXDATASIZE 1000 int main(int argc,char * argv[]) { int fd,numbytes; char buf[MAXDATASIZE]; struct hostent * he; struct sockaddr_in server; int i=1; if(argc!=2) { printf(\ \\n\ exit(-1); } if((he=gethostbyname(argv[1]))==NULL){ perror(\ exit(-1); } if((fd=socket(AF_INET,SOCK_STREAM,0))==-1){ perror(\ exit(1); } bzero(&server,sizeof(server)); 22 server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr=*((struct in_addr *)he->h_addr); if(connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1) { perror(\ exit(1); } if((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1) { perror(\ exit(1); } buf[numbytes]='\\0'; printf(\ printf(\ scanf(\ if((numbytes=send(fd,buf,strlen(buf),0))==-1) { perror(\ exit(1); } bzero(buf,1000); while(i){ printf(\ scanf(\ if(strlen(buf)<1) i=0 ; if((numbytes=send(fd,buf,strlen(buf),0))==-1) { perror(\ exit(1); 23 } bzero(buf,1000); if((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1) { perror(\ exit(1); } buf[numbytes]='\\0'; printf(\ printf(\ bzero(buf,1000); } close(fd); } 服务器端程序如下: #include void process_client(int connectfd,struct sockaddr_in client); void *start_routine(void *arg); void savedata(char *recvbuf, int len, char *cli_data); struct ARG{ int connfd; 24 struct sockaddr_in client; }; struct ARG *arg; int main(void) { int listenfd,connectfd; struct sockaddr_in server,client; int sin_size; int opt=SO_REUSEADDR; pthread_t tid; sin_size=sizeof(struct sockaddr_in); if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror(\ exit(-1); } setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1) { perror(\ exit(-1); } if(listen(listenfd,BACKLOG)==-1) { perror(\ exit(-1); 25