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);
}
bzero(buf,100);
if((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1) { perror(\
exit(1);
}
buf[numbytes]='\\0';
printf(\ printf(\ bzero(buf,100); } close(fd); }
26
(2)服务器端程序如下: #include
void process_client(int connectfd,struct sockaddr_in client); void *start_routine(void *arg); struct ARG{ int connfd;
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) {
27
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);
} 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)) {
28
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; }
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(\
29
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); } 30