C中Server和Client之间用Ring Buffer(循环缓冲区)进行数据交换
Data exchange between Server and Client with Ring Buffer (Circular Buffer) in C
我为多个客户端编写了客户端-服务器聊天(使用非阻塞套接字进行多路复用 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;
}
基本上,您需要两件事:
- 客户端和服务器之间的共享指针环。
- 您的客户端和服务器之间的共享缓冲区池。
环形缓冲区有多种风格:无锁、多消费者、多生产者等
查看 DPDK 的环库作为示例或无锁环。下面是算法的详细描述:
http://dpdk.org/doc/guides/prog_guide/ring_lib.html
我为多个客户端编写了客户端-服务器聊天(使用非阻塞套接字进行多路复用 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;
}
基本上,您需要两件事:
- 客户端和服务器之间的共享指针环。
- 您的客户端和服务器之间的共享缓冲区池。
环形缓冲区有多种风格:无锁、多消费者、多生产者等
查看 DPDK 的环库作为示例或无锁环。下面是算法的详细描述: http://dpdk.org/doc/guides/prog_guide/ring_lib.html