在两个Raspberry Pis C 之间发送重复命令的方法

Method to send repeated command between two Raspberry Pis c++

本文关键字:命令 方法 之间 两个 Pis Raspberry      更新时间:2023-10-16

我正在尝试编写一个程序,其中我在一个pi中键入命令,然后将其发送到另一个pi。我想并行两个类似的程序。有了下面的代码,我可以将pis连接起来,我可以发送1个命令,它们既执行并返回到可以发送命令的部分,但是客户端悬挂在Sleep_for(1s(部分。我对使用通信是相对较新的,因此对任何帮助表示赞赏。

我尝试过的大部分内容都涉及将建立连接从WARE循环中建立连接的代码的一部分移动。但是,正如我所说,我不熟悉这种类型的沟通方式,所以我一直专注于尝试更多地了解它。

客户端

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 occuredn");
        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 errorn");
                    }
                }
                if(n < 0){
                    printf("n Read error n");
                }
                Step = atoi(recvBuff);
                cout << "Step = " << Step << "n";
            }
        }
        else if (Step == 2){
            printf("2n");
            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("closedn");
        }
        else if (Step == 2){
            printf("2n");
            Step = 1;
        }
        else if (Step == 15){
            return 0;
        }
        else{
            Step = 1;
        }
    }
}

我期望我输入的数字输出2,2,向我表明代码是基于输入的正确步骤,我在第一次尝试时得到了这一点,但是在第一个输入之后代码自身悬挂。

    if(Step == 1){
        sleep_for(1s);
        while(Step == 10){

我们仅在Step为1时才通过if。但是,如果Step为10,我们仅输入while循环,因为它必须是1,否则我们将不一定是while。因此while循环内的代码将不会执行。

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

这被打破了。while循环的每次迭代都覆盖了先前接收的字节。如果发送的消息为" 10",而第一个read获取" 1",则获得" 0"的第二读将覆盖" 1",而atoi调用将获得0而不是10!