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(\ while(i){
printf(\ scanf(\ if(strlen(buf)<1) i=0 ;
if((numbytes=send(fd,buf,strlen(buf),0))==-1) { perror(\
exit(1);
}
if((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1) { perror(\
exit(1);
}
buf[numbytes]='\\0';
printf(\ %s\\n\
6
printf(\ } close(fd); }
服务器端程序如下: #include
void process_client(int connectfd,struct sockaddr_in client); int main(void) {
int listenfd,connectfd; struct sockaddr_in server,client; int sin_size;
int opt=SO_REUSEADDR; pid_t pid;
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));
7
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);
}
sin_size=sizeof(struct sockaddr_in); while(1){
if((connectfd=accept(listenfd,(struct sockaddr *) &client,&sin_size))==-1){ perror(\ exit(-1);
}
if((pid=fork())>0){ close(connectfd) ; continue; }
else if(pid==0){ close(listenfd);
process_client(connectfd,client); exit(1); } else {
perror(\ error.\\n\
exit(0);
8
} }
close(listenfd); }
void process_client(int connectfd,struct sockaddr_in client){ char recvbuf[MAXCHARSIZE]; char sendbuf[MAXCHARSIZE]; int recvlen,i;
printf(\ send(connectfd,\ while(recvlen=recv(connectfd,recvbuf,MAXCHARSIZE,0)){ recvbuf[recvlen]='\\0';
printf(\ for(i=0;i sendbuf[i] = recvbuf[recvlen - i -1] ; sendbuf[recvlen]='\\0'; send(connectfd,sendbuf,strlen(sendbuf),0); } close(connectfd); } 9 实验三 多进程服务器设计 参考源代码: 客户端程序如下: #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); } 10