Я прошу прощения за отсутствие английского языка.
Я создаю программу 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 и смартфон получает.
Я много думаю с моим другом, но мы не можем решить это.
Пожалуйста, дайте мне совет для решения этой проблемы.