/*** action for clientQueue[index] */ void handleReadBuf(int index){ struct clientMsg data; int retVal; //printf("readBuf:%s\n",ClientsQueue[index].readBuf); parseClientMsg(ClientsQueue[index].readBuf, &data); if(data.msg == 1){ ////printf("Read msg from client\n"); handleIncomingMsg(data, index); } else{ // client sent a move if(index != clientIndexTurn){ // it is not the client turn ////printf("Client played out of turn"); sendInvalidMoveToPlayer(index); return; } retVal = CheckAndMakeClientMove(data); clientIndexTurn = (clientIndexTurn+1) % (conPlayers); // keep the turn moving only between connected players if(retVal ==-1){ //printf("invalid client move\n"); sendInvalidMoveToPlayer(index); updateEveryoneOnMoveExceptIndex(index); notifyOnTurn(); } else{ //printf("valid client move\n"); updateEveryoneOnMove(index); if(retVal==0) { notifyOnTurn(); } } } // deleting read data from readBuf int i; for (i = 0; i < MSG_SIZE; ++i) { if (ClientsQueue[index].readBuf[i] == '}') { ClientsQueue[index].readBuf[i] = '\0'; if (ClientsQueue[index].readBuf[i+1] == '{') { //printf("in the if\n"); strcpy(ClientsQueue[index].readBuf, ClientsQueue[index].readBuf + i+1); break; } } ClientsQueue[index].readBuf[i] = '\0'; } //strcpy(ClientsQueue[index].readBuf, ClientsQueue[index].readBuf + CLIENT_MSG_SIZE); // const char *ptr = strchr(ClientsQueue[index].readBuf, ')'); // int ind = ptr - ClientsQueue[index].readBuf + 1; // strcpy(ClientsQueue[index].readBuf, ClientsQueue[index].readBuf + ind); }
void handleReadBuf(int index){ struct clientMsg data; int retVal; parseClientMsg(ClientsQueue[index].readBuf, &data); if (data.msg != 0) handleIncomingMsg(data, index); else{ // client sent a move if (index != clientIndexTurn){ // it is not the client turn, if didnt catch on the client side sendInvalidMoveToPlayer(index); return; } retVal = CheckAndMakeClientMove(data); clientIndexTurn = (clientIndexTurn + 1) % (conPlayers); // keep the turn moving only between connected players if (retVal == -1){ sendInvalidMoveToPlayer(index); LastTurnHeap = -1; //updateEveryoneOnMoveExceptIndex(index); notifyOnTurn(); } else if (retVal == 1) notifyOnDisconnectionToAll(index); else notifyOnTurn(); // if (retVal == 0) { // notifyOnTurn(); // } //} } // deleting read data from readBuf int i; for (i = 0; i < MSGTXT_SIZE; ++i) { if (ClientsQueue[index].readBuf[i] == '}') { ClientsQueue[index].readBuf[i] = '\0'; if (ClientsQueue[index].readBuf[i + 1] == '{') { //printf("in the if\n"); strcpy(ClientsQueue[index].readBuf, ClientsQueue[index].readBuf + i + 1); break; } } ClientsQueue[index].readBuf[i] = '\0'; } }
int main(int argc, char *argv[]) { char* server_name; int server_port; handleInput(argc, argv, &server_name, &server_port); int server_fd = setUpServer(server_port); while (1) { //accept printf("Waiting for client connection..\n"); int sock_fd = accept(server_fd, (struct sockaddr *) NULL, NULL); printf("Connection established. Start chatting!\n"); //date for select fd_set set; FD_ZERO(&set); int max_fd = sock_fd + 1; struct timeval timeout; timeout.tv_sec = TIMEOUT_SECS; timeout.tv_usec = 0; while (1) { FD_SET(STDIN_FILENO, &set); FD_SET(sock_fd, &set); if (select(max_fd, &set, NULL, NULL, &timeout) == -1) { perror("select failed"); exit(1); } char msg_buf[BUFFER_SIZE]; memset(&msg_buf, 0, sizeof(msg_buf)); if (FD_ISSET(STDIN_FILENO, &set)) { if (!handleOutgoingMsg(sock_fd, msg_buf, server_name)) { printf("Closing server..\n"); free(server_name); exit(0); } } if (FD_ISSET(sock_fd, &set)) { if (!handleIncomingMsg(sock_fd, msg_buf)) { printf("Connection ended.\n"); break; } } } } return 0; }