Code:
/* prs.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
main(int argc, char *argv[]) {
int port, sock, serverlen; char buf[10],move1[10],move2[10],choice,howmuch;
int n=1,score1,score2;
struct sockaddr_in server;
struct sockaddr *serverptr;
struct hostent *rem;
if (argc < 3) {
printf("Please give host name and port number\n"); exit(1); }
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket"); exit(1); }
if ((rem = gethostbyname(argv[1])) == NULL) {
perror("gethostbyname"); exit(1); }
port = atoi(argv[2]);
server.sin_family = AF_INET;
bcopy((char *) rem -> h_addr, (char *) &server.sin_addr,
rem -> h_length);
server.sin_port = htons(port);
serverptr = (struct sockaddr *) &server;
serverlen = sizeof server;
if (connect(sock, serverptr, serverlen) < 0) {
perror("connect"); exit(1); }
while(1) {
bzero(buf, sizeof buf);
if(read(sock,&howmuch,sizeof(int))<0) {
perror("read");
exit(1);
}
if(read(sock, buf,howmuch) < 0) {
perror("read");
exit(1);
}
if(!strcmp(buf,"STOP")) break;
if(!strcmp(buf,"READY")) {
printf("Give round %d play: ",n);
choice=getchar();getchar();
switch(choice) {
case 'p':
howmuch=6;
if(write(sock,&howmuch,sizeof(int))<0){
perror("read");
exit(1);
}
if(write(sock,"PAPER",6) < 0) {
perror("read");
exit(1);
}
strcpy(move2,"PAPER");
break;
case 'r':
howmuch=5;
if(write(sock,&howmuch,sizeof(int))<0){
perror("read");
exit(1);
}
if(write(sock,"ROCK",5) < 0) {
perror("read");
exit(1);
}
strcpy(move2,"ROCK");
break;
case 's':
howmuch=9;
if(write(sock,&howmuch,sizeof(int))<0){
perror("read");
exit(1);
}
if(write(sock,"SCISSORS",9)<0) {
perror("read");
exit(1);
}
strcpy(move2,"SCISSORS");
break;
default:
printf("Invalid choice\n");
}
}
bzero(move1,sizeof move1);
printf("%s\n",move2); /* Here it prints as it should */
fflush(stdout);
if(read(sock,&howmuch,sizeof(int))<0) {
perror("read");
exit(1);
}
printf("\"%s\"\n",move2); /* Here it doesn't print anything */
if(read(sock,move1,howmuch)<0) {
perror("read");
exit(1);
}
printf("Player 1:%10s Player2:%10s \n",move1,move2);
n++;
}
if(read(sock,&score1,sizeof(int))<0) {
perror("read");
exit(1);
}
if(read(sock,&score2,sizeof(int))<0) {
perror("read");
exit(1);
}
printf("Score = %d - %d\n",score1,score2);
if(score1==score2) printf("Nobody won\n");
else printf("You %s\n",(score1>score2?"lost":"won"));
close(sock);
exit(0);
}