实验四 多线程服务器设计
参考源代码: 客户端程序如下: #include
#define MAXDATASIZE 100 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));
16
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,100); while(i){
printf(\ scanf(\ if(strlen(buf)<1) i=0 ;
if((numbytes=send(fd,buf,strlen(buf),0))==-1) { perror(\
exit(1);
17
}
bzero(buf,100);
if((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1) { perror(\
exit(1);
}
buf[numbytes]='\\0';
printf(\ printf(\ bzero(buf,100); } close(fd); }
服务器端程序如下: #include
void process_client(int connectfd,struct sockaddr_in client); void *start_routine(void *arg); struct ARG{ int connfd;
18
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);
}
19
while(1) {
if((connectfd=accept(listenfd,(struct sockaddr *) &client,&sin_size))==-1) { perror(\ exit(-1);
}
arg=(struct ARG *)malloc(sizeof (struct ARG)); arg -> connfd = connectfd;
memcpy((void *)&arg -> client, &client, sizeof(client)); if(pthread_create(&tid, NULL, start_routine, (void *)arg)) {
perror(\ error.\\n\ exit(-1); } }
close(listenfd); }
void process_client(int connectfd,struct sockaddr_in client){ char recvbuf[MAXCHARSIZE]; char sendbuf[MAXCHARSIZE]; char client_name[MAXCHARSIZE]; int recvlen,i;
printf(\ send(connectfd,\ recvlen=recv(connectfd,client_name,MAXCHARSIZE,0); if(recvlen==0){ close(connectfd);
printf(\ return; }
20