/* ------------------main_srv.c --------------------------- * server using TCP protocol * * simple error handling */ int solution[4] = {1, 3, 5, 2}; int sol_used[6] = {1, 1, 1, 0, 1, 0}; #include #include #include "inet.h" #include "sign.h" int guess(int guess, int socket) { int i, z; int numbers[4], used[6]; int black = 0, white = 0; char res[MAXLINE]; for (i = 0; i < 6; i++) used[i] = 0; if ((guess < 1234) || (guess > 6543)) return(send(socket, "Bad input\r\n", 11, 0)); for (i = 0; i < 4; i++) { z = guess % 10; if (!z || (z > 6)) return(send(socket, "Bad numbers\r\n", 13, 0)); if (used[z - 1]) return(send(socket, "Digits must be unique\r\n", 23, 0)); numbers[i] = z; used[z - 1] = 1; guess /= 10; } for (i = 0; i < 4; i++) { if (numbers[i] == solution[i]) black++; else if (sol_used[numbers[i] -1]) white++; } sprintf(res, "Your guess: %d black and %d white.\r\n", black, white); return send(socket, res, strlen(res), 0); /* error = send(newsockfd, res, strlen(res), 0); */ } int main() { int sockfd,newsockfd,clilen,childpid, n; struct sockaddr_in cli_addr, serv_addr; char recvline[MAXLINE]; if( (ignoresig(SIGCHLD) == SIG_ERR) ) { perror("Signal"); exit(1); } /* * open a TCP socket - Internet stream socket */ if ( (sockfd = socket(AF_INET, SOCK_STREAM,0)) < 0) { perror("server: can't open stream socket"); exit(1); } /* * bind our local address so that the client can send us */ /*bzero((char *) &serv_addr, sizeof(serv_addr));*/ memset((char *) &serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* INADR_ANY: tells the system that we'll accept a connection * on any Internet interface on the system, if it is multihomed * Address to accept any incoming messages (-> in.h). * INADDR_ANY is defined as ((unsigned long int) 0x00000000) */ serv_addr.sin_port = htons(SERV_TCP_PORT); if ( bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { perror("server: can't bind local address"); exit(1); } listen(sockfd,5); while(1) { /* * wait for a connection from a client process * - concurrent server - */ clilen=sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0 ) { if (errno == EINTR) continue; /*try again*/ perror("server: accept error"); exit(1); } if ( (childpid = fork()) < 0) { perror("server: fork error"); close(sockfd); close(newsockfd); exit(1); } else if (childpid == 0) { int running = 1, error = 0; char rec[MAXLINE]; close(sockfd); do { if ((n=recv(newsockfd, recvline, MAXLINE, 0)) < 0) exit(2); strncpy(rec, recvline, n); rec[n] = '\0'; printf("Got: %d chars: %s", n, rec); if (strstr(rec, "quit")) { close(newsockfd); exit(3); } error = guess(atoi(rec), newsockfd); /* if ((input = atoi(rec)) == 0) { error = send(newsockfd, "Not a number\r\n", 14, 0); printf("Null\n"); } else { printf("Nr: %d\n", input); sprintf(res, "Your guess: %d\r\n", input); error = send(newsockfd, res, strlen(res), 0); } */ /* if( send(newsockfd,rec,n,0) < n) exit(4); */ } while (running & (error >= 0)); close(newsockfd); exit(0); } close(newsockfd); /*parent*/ } }