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

时间:2019-06-27 15:03:41

标签: c++ sockets raspberry-pi

我试图编写一个程序,在其中一个Pi上键入命令,然后将其发送到另一个Pi。我想让两个类似的程序并行运行。使用下面的代码,我可以使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 :(得分:0)

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

如果if为1,则仅传递Step。但是,如果while为10,则仅进入Step循环,因为必须这样做,所以永远不会通过设为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之十!