Моя программа должна считывать данные датчика каждые 10 миллисекунд и отправлять их клиенту через сокет TCP.Программа написана на языке Си.Коды чтения tcp-сервера и датчика находятся в одном и том же файле c.Сервер не отправляет данные периодически.Вместо этого он ожидает запроса данных (каждые 50 миллисекунд) от клиента.Как только сервер получает запрос, он отправляет данные клиенту.
Моя проблема в том, что мне нужно считывать датчики каждые 10 миллисекунд и сохранять их в буфере.Как только сервер получит запрос, отправьте данные датчика в буфере клиенту.Но когда tcp-сервер ожидает запроса, вся программа застряла в функции чтения:
n = read(newsockfd,buffer,31)
Тогда я не могу прочитать датчики.
Я попытался использовать многопоточность для датчикачтение и tcp сервер.Это работает для чтения датчиков.Но, если я добавлю usleep (), например, 5 миллисекунд в поток tcp-сервера, пройдет 5 миллисекунд перед отправкой данных клиенту.
Моей программе нужно, чтобы tcp-сервер отправлял данные клиенту сразу после получения запроса.Между тем считывайте датчики каждые 10 миллисекунд.У кого-нибудь есть лучшее решение?
Коды для tcp-сервера и показаний датчика следующие:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#define MAX_SIZE 256
#define SAMPLE_RATE
void read_sensor(void) {
printf("read sensors\n");
}
int main() {
int sockfd, newsockfd, portno = 10000, clilen;
char buffer[MAX_SIZE];
struct sockaddr_in serv_addr, cli_addr;
int n;
int data;
printf( "using port #%d\n", portno );
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
printf("ERROR opening socket\n");
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons( portno );
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error( const_cast<char *>( "ERROR on binding" ) );
listen(sockfd,5);
clilen = sizeof(cli_addr);
while (1) {
printf( "waiting for new client...\n" );
if ( ( newsockfd = accept( sockfd, (struct sockaddr *) &cli_addr, (socklen_t*) &clilen) ) < 0 )
printf("ERROR on accept");
printf( "opened new communication with client\n" );
clock_gettime(CLOCK_REALTIME, &gettime_now);
start_time = gettime_now.tv_nsec; //Get nS value
while (1) {
int n = 0;
if ( (n = read(newsockfd,buffer,31) ) < 0 ) //read data
printf("ERROR reading from socket");
buffer[n] = '\0';
if (n > 0)
printf("%s\n", buffer);
else {
break;
}
if ( (n = write( newsockfd, buffer, strlen(buffer) ) ) < 0 ) //send data
printf( "ERROR writing to socket\n");
buffer[n] = '\0';
}
close( newsockfd );
}
return 0;
}