Как вернуть указатель на память куска данных в кольцевом буфере в C?
Так что у меня есть эта программа, где она получает данные в модели клиент / сервер в Linux. У меня есть круговой буфер. Я хочу сохранить 16384 фрагмента данных и установить флаг после заполнения 16384.
Затем верните указатель на этот массив после его заполнения. затем переходит к следующему фрагменту и так далее. и когда мой массив заполнен. это начинается снова. но я не знаю, как вернуть первый указатель каждый раз, когда он меняется. Я чувствую, что моя логика кода неверна.
Любая помощь будет оценена:
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
#include <stdbool.h>
#define MAX_ITEMS 524288 //nearest power of 2 to half million (2^19)
typedef struct circularQueue_s
{
int first;
int last;
int validItems;
int data[MAX_ITEMS];
} circularQueue_t;
void initializeQueue(circularQueue_t *theQueue);
int isEmpty(circularQueue_t *theQueue);
int putItem(circularQueue_t *theQueue, int theItemValue);
int getItem(circularQueue_t *theQueue, int *theItemValue);
void printQueue(circularQueue_t *theQueue);
void initializeQueue(circularQuete_t *theQueue)
{
int i;
theQueue->validItems = 0;
theQueue->first = 0;
theQueue->last = 0;
for (i = 0; i<MAX_ITEMS; i++)
{
theQueue->data[i] = 0;
}
return;
}
int isEmpty(circularQueue_t *theQueue)
{
if (theQueue->validItems == 0)
return(1);
else
return(0);
}
//puts new item at the end of the queue, moves rear pointer ahead by 1
int putItem(circularQueue_t *theQueue, int theItemValue)
{
if (theQueue->validItems >= MAX_ITEMS)
{
printf("The queue is full\n");
printf("You cannot add items\n");
return(-1);
}
else
{
theQueue->validItems++;
theQueue->data[theQueue->last] = theItemValue;
theQueue->last = (theQueue->last + 1) % MAX_ITEMS;
}
}
int main(int argc, char *argv[])
{
int sockfd = 0, n = 0;
int recvBuff[16384];
struct sockaddr_in serv_addr;
circularQueue_t myQueue;
initializeQueue(&myQueue);
bool messageReceivedFlag = false;
memset(recvBuff, '0', sizeof(recvBuff));
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Error : Could not create socket \n");
return 1;
}
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_addr.s_addr = inet_addr("192.168.100.200");
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(5000);
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\n Error : Connect Failed \n");
return 1;
}
int count;
while ((n = recv(sockfd, recvBuff, sizeof(recvBuff), 0)) > 0)
{
count = 0;
while (count < 16385)
{
putItem(&myQueue, recvBuff[count]);
count++;
if (count == 16384) {
messageReceivedFlag = true;
}
}
}
printf("then: %d\n", n);
if (n < 0)
{
printf("\n Read error \n");
}
return &myQueue;
}