c клиент отправляет символ, но сервер получает номер - PullRequest
0 голосов
/ 24 октября 2018

для выполнения задания нам необходимо сделать игру с функциональностью клиент-сервер.В настоящее время я пытаюсь отправить один символ от клиента на сервер, который связан с опцией.В этом случае я отправляю символ «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);
            }       
        }
    }
}

Заранее всем спасибо за помощь:)

1 Ответ

0 голосов
/ 24 октября 2018

Сервер не может прочитать 20736, поскольку char может иметь только значения от 0 до 255 или от -128 до 127. A char может быть подписанным или без знака, стандарт c допускает и то, и другое.Если вам требуется неподписанный, вы должны написать unsigned char, а если вам нужен подписанный, вы должны написать signed char;Если вы просто напишите char, вы оставите это на усмотрение компилятора.Но сегодня на всех распространенных платформах символ определяется как один байт, а байт имеет 8 битов на всех современных платформах, и, таким образом, один байт никогда не может быть 20736.

Может быть проблема в том, что вы печатаетенесколько номеров?Поскольку printf не добавит пробел после вывода или новой строки.Таким образом, этот код

prinft("10");
prinft("20");
prinft("30");

на самом деле напечатает

102030
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...