2017-05-24 2 views
1

Ich schrieb Client-Server-Chat für mehrere Clients (multiplexen I/O mit nicht-blockierenden Sockets).Datenaustausch zwischen Server und Client mit Ring Buffer (Circular Buffer) in C

Jetzt habe ich pufferSize (zum Beispiel Länge = 64) behoben. Ich möchte den Datenaustausch zwischen Client und Server mit Ring Buffer machen. Ich schrieb auch ein paar Funktionen (Pufferinisialisierung, popFront und pushBack), um in einen Puffer zu schreiben.

Wie ist es möglich, diese Idee zu realisieren? Zum Beispiel nehme ich an, dass ich 2 Strukturen benötige: die erste Struktur hat eine Pufferlänge und einen Zeiger auf Daten in dem anderen Puffer, der zweite Puffer hat Daten. Aber jetzt habe ich keine Ahnung, was ich damit machen soll. Können Sie mir einen Rat geben und vielleicht mit Code zeigen? Vielen Dank.

Hier meine Ringbuffer Strukturen und Funktion sind (ich nehme an, die Funktion buffer falsch ist):

struct ringBuffer 
{ 
    int *bufferData; 
    int head; 
    int tail; 
    int size; 
}; 

void bufferFree(struct ringBuffer *buffer) 
{ 
    free(buffer->bufferData); 
} 

void bufferInitialization(struct ringBuffer *buffer, int size) 
{ 
    buffer->size = size; 
    buffer->head = 0; 
    buffer->tail = 0; 
    buffer->bufferData = (int*)malloc(sizeof(int) * size); 
} 

int pushBack(struct ringBuffer *buffer, int data) 
{ 
    buffer->bufferData[buffer->tail++] = data; 
    if (buffer->tail == buffer->size) 
    { 
     buffer->tail = 0; 
    } 
    return 0; 
} 

int popFront(struct ringBuffer *buffer) 
{ 
    if (buffer->head != buffer->tail) 
    { 
     buffer->head++; 
     if (buffer->head == buffer->size) 
     { 
      buffer->head = 0; 
     } 
    } 
    return 0; 
} 

int bufferSize(struct ringBuffer *buffer) 
{ 
    if (buffer->head >= buffer->tail) 
    { 
     return (buffer->head - buffer->tail); 
    } 
    else 
    { 
     return buffer->size - ((buffer->size - buffer->tail) + buffer->head); 
    } 
    /*for (int i = buffer->head; buffer->head < buffer->tail; i++) 
    { 
    printf("head[%d] and tail[%d] --> bufferData = %d", buffer->head, buffer->tail, buffer->bufferData); 
    }*/ 
    return 0; 
} 

Antwort

2

Grundsätzlich benötigen Sie zwei Dinge:

  1. Ein gemeinsamer Ring von Zeigern zwischen den Clients und Server.
  2. Ein gemeinsamer Pufferpool zwischen Ihren Clients und dem Server.

Es gibt eine Vielzahl von Aromen für die Ringpuffer: lockless, Multi-Verbraucher, Multi-Produzent usw.

Werfen Sie einen Blick auf DPDK Ring Bibliothek als Beispiel oder lockless Ringe. Hier ist eine detaillierte Beschreibung der Algorithmen: http://dpdk.org/doc/guides/prog_guide/ring_lib.html

Und hier ist der Code: http://dpdk.org/browse/dpdk/tree/lib/librte_ring

+0

Danke, ich studieren werde. Ich denke, ich brauche etwas einfaches basierend auf meinen Strukturen und Funktionen –

+0

@GeorgeZ. Ändern Sie einfach das Array von Ints in Array von Zeigern und übergeben Sie die Puffer, nicht ints? –

+0

Vielleicht wird es funktionieren, ich werde es versuchen, danke. Ich möchte es in einem separaten Projekt debuggen (nicht mit send(), recv(), etc). So wie ich habe, muss ich nur Daten senden, wenn der Puffer voll ist, (wenn Buffsize = 8 Bytes, zum Beispiel) und dann andere 8 Bytes bis meine String-Länge in meiner Nachricht (50 Bytes) erreicht werden. Stimmt? –