для выполнения задания нам необходимо сделать игру с функциональностью клиент-сервер.В настоящее время я пытаюсь отправить один символ от клиента на сервер, который связан с опцией.В этом случае я отправляю символ «Q», который вводится игроком с помощью функции scanf ().При вводе клиент правильно читает символ как 'Q', но при отправке на сервер он читается как 20736, который, как я предполагаю, является кодом ascii для буквы Q.
Это очень страннопотому что я отправляю кучу символов с сервера клиенту ранее в коде, используя тот же метод, и он прекрасно воспринимается как символ.Есть идеи, почему это происходит в одном случае, а не в другом?Это мой первый опыт использования C, так что, вероятно, я упускаю что-то простое.
Ниже приведен код от клиента и сервера, где клиент отправляет входные данные от клиента на сервер.В настоящее время сервер просто печатает полученный символ, чтобы проверить, правильно ли он работает.Типы GameBoard и GameState - это структуры, которые имеют двумерный массив символов, называемых плитками, а также некоторые другие переменные.
printf ("% c", receiveString) печатает 20736 в первом фрагменте кода сервера, когдаклиент отправляет переменную типа char 'optionSelected', которая имеет значение 'Q', введенное пользователем.Это должно быть печать «Q».Он также возвращает false в операторах if 'if (receiveString ==' Q ').
client:
void playGame(int sockfd) {
int remainingMines = 10, gameOver = 0;
char optionSelected;
gameBoard board = receiveBoardState(sockfd);
while(gameOver == 0) {
printf("\n\n\nRemaining mines: %d \n\n", remainingMines);
displayBoard(board);
printf("\n\nChoose an option: \n<R> Reveal tile\n<P> Place flag\n<Q> Quit game \n\n Option (R, P, Q):");
scanf("%c", &optionSelected);
send(sockfd, &optionSelected, sizeof(char), 0);
if (optionSelected == 'Q') {
gameOver = 1;
}
}
}
Сервер:
void playGame(int new_fd) {
char receiveString;
int numbytes, gameOver = 0;
GameState game = constructGamestate();
sendBoard(game, new_fd);
if ((numbytes=recv(new_fd, &receiveString, sizeof(char), 0)) == -1) {
perror("recv");
exit(1);
}
printf("%c", receiveString);
}
Также здесьфрагменты кода, в которых клиент правильно получает и печатает символ, отправленный ему с сервера.
Клиент:
gameBoard receiveBoardState(int sockfd) {
gameBoard board;
char receiveData;
int numbytes;
for(int i = 0; i < NUM_TILES_X; i++) {
for(int j = 0; j < NUM_TILES_Y; j++) {
if ((numbytes=recv(sockfd, &receiveData, sizeof(char), 0)) == -1) {
perror("recv");
exit(1);
} else board.tiles[i][j] = receiveData;
}
}
return board;
}
Сервер:
void sendBoard(GameState game,int new_fd) {
char * uiElements = "ABCDEFGHI";
char sendChar;
printf(" 1 2 3 4 5 6 7 8 9\n");
printf("---------------------");
for(int i = 0; i < 9; i++) {
for(int j = -1; j < 9; j++) {
if (j == -1) {
printf("\n%c |",uiElements[i]);
} else {
sendChar = (game.tiles[i][j].adjacent_mines + '0');
if (game.tiles[i][j].is_mine == true)
sendChar = '*';
printf(" %c", sendChar);
send(new_fd, &sendChar, sizeof(char), 0);
}
}
}
}
Заранее всем спасибо за помощь:)