Способ отправки повторной команды между двумя Raspberry Pis c ++ - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь написать программу, в которой я набираю команду на одном Пи, а затем она отправляется другому Пи.Я хочу, чтобы две похожие программы работали параллельно.С помощью приведенного ниже кода я могу заставить Pis подключиться и отправить 1 команду, они оба выполняются и возвращаются в раздел, где я могу отправить команду, но клиент зависает там, в разделе sleep_for (1s).Я относительно новичок в использовании связи, поэтому любая помощь приветствуется.

Большая часть того, что я пробовал, касалась перемещения части кода, которая устанавливает соединение, из цикла while.Но, как я уже сказал, я не знаком с тем, как работает этот тип общения, поэтому я сосредоточился на том, чтобы попытаться понять его больше.

Клиент

int main () {
    time_t start_time = 0;
    time_t now_time = 0;
    int loop = 1;
    int Step = 1;
    int sockfd = 0, n = 0;
    char recvBuff[1024];
    struct sockaddr_in serv_addr;
    memset(recvBuff, '0',sizeof(recvBuff));
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&serv_addr, '0', sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(5000);
    if(inet_pton(AF_INET, "169.254.220.0", &serv_addr.sin_addr)<=0){
        printf("\n inet_pton error occured\n");
        return 1;
    }
    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){
       printf("\n Error : Connect Failed \n");
       return 1;
    }
    while (loop == 1){
        if(Step == 1){
            sleep_for(1s);
            while(Step == 10){
                printf("Listening");
                while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0){
                    recvBuff[n] = 0;
                    if(fputs(recvBuff, stdout) == EOF){
                        printf("\n Error : Fputs error\n");
                    }
                }
                if(n < 0){
                    printf("\n Read error \n");
                }
                Step = atoi(recvBuff);
                cout << "Step = " << Step << "\n";
            }
        }
        else if (Step == 2){
            printf("2\n");
            Step = 1;
        }
        else if (Step == 15){
            return 0;
        }
        else{
            Step = 1;
        }
    }
}

Сервер

int main () {
    time_t start_time = 0;
    time_t now_time = 0;
    int loop = 1;
    int Step = 1;
    int listenfd = 0, connfd = 0;
    struct sockaddr_in serv_addr;
    char sendBuff[1025];
    printf("Here's johnny");
    cout << "\nStep A: " << Step << "\n";
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&serv_addr, '0', sizeof(serv_addr));
    memset(sendBuff, '0', sizeof(sendBuff));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(5000);
    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    listen(listenfd, 10);
    while (loop == 1){

        if(Step == 1){
            connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
            cout << "Step ? ";
            cin >> Step;
            cout << "\n Step B: " << Step << "\n";
            snprintf(sendBuff, sizeof(sendBuff), "%d", Step);
            write(connfd, sendBuff, strlen(sendBuff));
            close(connfd);
            printf("closed\n");
        }
        else if (Step == 2){
            printf("2\n");
            Step = 1;
        }
        else if (Step == 15){
            return 0;
        }
        else{
            Step = 1;
        }
    }
}

Я ожидаю вывод числа, которое я ввожу как шаг, 2, показывая, что код прошелна правильный шаг, основанный на вводе, и я получаю это с первой попытки, но после этого первого ввода код зависает.

1 Ответ

0 голосов
/ 27 июня 2019
    if(Step == 1){
        sleep_for(1s);
        while(Step == 10){

Мы только передаем if, если Step равно 1. Но мы входим в цикл while, только если Step равно 10, чего никогда не будет, так как должно было быть 1, иначе у нас не будет добрался до while в первую очередь. Поэтому код внутри цикла while не будет выполнен.

            while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0){
                recvBuff[n] = 0;
                if(fputs(recvBuff, stdout) == EOF){
                    printf("\n Error : Fputs error\n");
                }
            }

Это сломано. Каждая итерация цикла while перезаписывает ранее полученные байты. Если отправляемое сообщение имеет значение «10», а первое read получает «1», второе чтение, которое получает «0», перезапишет «1», а вызов atoi получит 0 вместо 10!

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