Развилка в распи - PullRequest
       6

Развилка в распи

0 голосов
/ 05 ноября 2018

Я прошу прощения за отсутствие английского языка.

Я создаю программу TCP / NRF Raspi.

но я думаю, что мой вопрос связан с Linux больше, чем с Raspi. Поэтому я пишу этот вопрос в stackoverflow.

сначала мой код

    #include <stdio.h>
    #include <time.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <cstdlib>
    #include <iostream>
    #include <sstream>
    #include <RF24/RF24.h>
    #include <sys/socket.h>
    #include <sys/stat.h>
    #include <arpa/inet.h>

    // HEADER LIST

    using namespace std;

    RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);
    // NRF24L01 SETTING CE - PIN 15 , CSN - PIN 24

    const uint64_t pipes[2] = { 0xABCDABCD71LL, 0x544d52687CLL };
    //RADIO PIPE SETTING

    #define TCP_PORT 8888
    #define BUFSIZE 100
    //PORT SETTING

    int main(int argc, char**){

        FILE *fp;
        int fd;
        time_t now_time;
struct tm *now_date;
char buf1[40];
char buf2[10];
int serv_sock;
struct sockaddr_in clnt_addr;
int clnt_sock;
struct sockaddr_in serv_addr;
socklen_t clnt_addr_size;
char send_buf[BUFSIZE]= "";
char buf[BUFSIZE] = "";
pid_t  pid1, pid2;
fd = open("log", O_RDWR | O_CREAT | O_APPEND, 0644);

if((serv_sock = socket(PF_INET, SOCK_STREAM, 0)) <  0){
    perror("SOCKET ERROR");
    return 0;
}
//socket create

bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(TCP_PORT);
//socket setting

if(bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){
    perror("BIND ERROR");
    return 0;
}
// bind

if(listen(serv_sock, 8) < 0){
    perror("LISTEN ERROR");
    return 0;
}
//listen

radio.begin();
radio.setRetries(15,15);
radio.printDetails();
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);
radio.startListening();
//radio setting

printf("******SERVER READY******\n");
while (1)
{
    pid1 = fork();
    switch (pid1)
    {
    case -1: // FORK ERROR
        perror("FORK1 ERROR");
        return 0;
        break;

    case 0: //SON PROCESS FOR TCP
        clnt_addr_size = sizeof(clnt_addr);
        clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_size);
        if (clnt_sock < 3) {
            perror("ACCEPT ERROR");
            return 0;
        }//ACCEPT ERROR
        printf("CLIENT IS CONNECTED : %s\n", inet_ntoa(clnt_addr.sin_addr));
        fp = fopen("log", "r");

        pid2 = fork() :
            switch (pid2) {
            case -1:
                perror("FORK2 ERROR");
                return 0;
                break;

            case 0:
                fp = fopen("log", "r");
                if (fp == NULL) {
                    write(clnt_sock, "NOTHING", 9);
                }
                else {
                    while (fgets(send_buf, sizeof(send_buf), fp) != NULL) {
                        write(clnt_sock, send_buf, strlen(send_buf) + 1);
                    }//while
                }//else

                if (read(clnt_sock, buf, sizeof(buf)) < 0)
                {
                    close(clnt_sock);
                }//if
                return 0;
                break;
            }//switch2
    default: // PARENT PROCESS FOR NRF
        if (radio.available()) {
            char msg[2] = "";
            radio.read(&msg, sizeof(msg));
            time(&now_time);
            now_date = localtime(&now_time);
            strcpy(buf1, asctime(now_date));
            sprintf(buf2, "MODULE %s\n", msg);
            strcat(buf1, buf2);
            printf("MODULE %s DETECTED\n", msg);
            write(fd, buf1, strlen(buf1));
            delay(925);
            break;
        }
    }//switch1
}// while
close(serv_sock);
close(fd);
fclose(fp);
return 0;
}//main

цикл родительской программы для прослушивания NRF от arduino. Это работает хорошо. Программа pid1 fork son для TCP соединения со смартфоном. Это работает хорошо. Программа pid2 fork son для TCP записи на смартфон. Это проблема.

Во время работы программы pid2 son не отправляет сокет TCP. но когда программа заканчивается, pid2 отправляет сокет TCP и смартфон получает.

Я много думаю с моим другом, но мы не можем решить это.

Пожалуйста, дайте мне совет для решения этой проблемы.

...