Exemple #1
0
/***
	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);
}
Exemple #2
0
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;
}