Я очень новичок в программировании и особенно в программировании сокетов на C.
Я пытаюсь добиться запуска сервера сокетов (я писал на C) на Linux-машине (Ubuntu).
Эта серверная программа должна собирать данные с входного контакта и отметки времени (системное время) - это прекрасно работает.
Теперь я попытался отправить несколько кусков данных в буфер и прочитать всебуфер каждые несколько секунд в Matlab (data = fscanf (socket)).
В целях тестирования я использовал цикл for, который собирает 10.000 выборок данных, и мне удалось установить соединение в MatLab с сокетом.
Когда я пытаюсь прочитать буфер сокетов в MatLab, все, что я получаю, это первая итерация моего цикла (например: 0 0.04102564 1572266844676), хотя он печатает все 10.000 значений в консоли при запуске тестовой клиентской программы насам компьютер.
Так что, похоже, у меня проблемы с записью в буфер, и я пока не могу найти способ записи всех значений.
Надеюсь, вы, ребята,может помочь мне в достижении этой цели или дать мне указание о том, что делать для исследования, поскольку я пока не могу найти какие-либо решения в Интернете.
C-CODE-SOCKET-SERVER:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
#include <sys/time.h> //Header for timestamp
#include "/usr/include/linux/stddef.h" //Header for NULL
#include "/RedPitaya/api/include/redpitaya/rp.h" //Header for RP API
//SOCKET SERVER
int main(int argc, char *argv[])
{
// Variablen Deklaration
int listenfd = 0, connfd = 0;
struct sockaddr_in serv_addr;
char sendBuff[1025];
float value; //Measured voltage value
struct timeval tv; //Timestamp
// Initialization of API
if (rp_Init() != RP_OK) {
fprintf(stderr, "Red Pitaya API init failed!\n");
return EXIT_FAILURE;
}
//Open a socket
listenfd = socket(AF_INET, SOCK_STREAM, 0); //Creates IPV4 TCP Socket
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff));
if (listenfd == -1) { //listenfd = 0 means socket opened successfully
printf("Error: unable to open a socket\n");
exit(1);
}
//Create an Adress
serv_addr.sin_family = AF_INET; //Adresse nach IP-Protokoll V4 (IPV6 = AF_INET6)
serv_addr.sin_addr.s_addr = htons(INADDR_ANY);
serv_addr.sin_port = htons(5000); //Port XXXX for Communication
if ((bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))) == -1) {
printf("Error: unable to bind\n");
printf("Error code: %d\n", errno);
exit(1);
}
listen(listenfd, 10);
while(1)
{
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
if (connfd == -1) {
printf("Error: unable to accept connections\n");
printf("Error code: %d\n", errno);
exit(1);
}
for(int i=0; i<10000;i++){
//Get AI1-Value
rp_AIpinGetValue(1, &value); //Read Voltage of Pin1
//Get Timestamp
gettimeofday(&tv, NULL);
unsigned long long millisecondsSinceEpoch =
(unsigned long long)(tv.tv_sec) * 1000 +
(unsigned long long)(tv.tv_usec) / 1000;
//Ausgabe der Werte
if(snprintf(sendBuff, sizeof(sendBuff), "%d %1.8f %llu\n", i, value, millisecondsSinceEpoch) < 0) //schreibt Output in buffer "sendBuff"
{
printf("Input larger than buffersize");
printf("Error code: %d\n", errno);
}
if (write(connfd, sendBuff, strlen(sendBuff)) == -1) //Writing buffer to client (connfd)
{
printf("Error: Writing failed\n");
printf("Error code: %d\n", errno);
exit(1);
}
}
close(connfd);
usleep(1); //Sleep in Millisekunden
}
// Releasing resources
rp_Release();
return EXIT_SUCCESS;
}
MATLAB-CODE
%% Socket Communication TCP/IP
socket = tcpip('192.168.0.164', 5000, 'NetworkRole', 'client');
fopen(socket);
%% Read Data from socket
data = fscanf(socket) %fscanf - ASCII / fread - binary / binclockread - binary-block