我为我缺乏英语而道歉。
我正在制作一个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用于TCP的fork子程序与智能手机连接。它运作良好。 pid2 fork子程序,用于将TCP写入智能手机。这是问题。
在程序操作期间,pid2子不发送TCP套接字。 但是,当程序结束时,pid2发送TCP套接字,智能手机接收。
我和我的朋友想了很多,但是我们解决不了。
请给我一些解决此问题的提示。