c - C中Server和Client之间用Ring Buffer(循环缓冲区)进行数据交换

标签 c server client buffer circular-buffer

我为多个客户端编写了客户端-服务器聊天(使用非阻塞套接字多路复用 i/o)。

现在我有固定的 bufferSize(例如,length = 64)。 我想用 Ring Buffer 在客户端和服务器之间进行数据交换。我还编写了一些函数(缓冲区初始化、popFront 和 pushBack)来写入缓冲区。

如何实现这个想法?例如,我想我需要 2 个结构:第一个结构有 bufferlength 和指向另一个缓冲区中数据的指针,第二个缓冲区有数据。但现在我不知道我应该用它做什么。你能给我一个建议,也许用代码展示吗?谢谢。

这是我的 ringBuffer 结构和函数(我想函数 bufferSize 是错误的):

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;
}

最佳答案

基本上,您需要两件事:

  1. 客户端和服务器之间的共享指针环。
  2. 客户端和服务器之间的共享缓冲区池。

环形缓冲区有多种风格:无锁、多消费者、多生产者等。

以 DPDK 的环库为例或无锁环。下面是算法的详细描述: http://dpdk.org/doc/guides/prog_guide/ring_lib.html

下面是代码: http://dpdk.org/browse/dpdk/tree/lib/librte_ring

关于c - C中Server和Client之间用Ring Buffer(循环缓冲区)进行数据交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44153822/

相关文章:

javascript - 如何在 Express.js 中添加 Angular 2 应用程序作为 View

javascript - 在没有服务器的情况下建立 Html5 canvas javascript p2p 连接

c++ - 为嵌入式 Lua 重定向/重新定义 print()

c - Fseek on C 问题

PHP如何允许mysql从远程服务器连接

apache - 如何在 Apache 服务器上启用 mod_rewrite

java - 从 Java 服务器向 Android 推送数据

java - 客户端未连接到服务器

c - 解析不同字符串的相等 XOR 值以进行字谜检测

c - Printf 只打印字符串中的第一个单词?