Windows下Socket TCP网络传输及ping-pong缓冲区进程同步研究实现

该博客探讨了一个Windows平台上的TCP网络传输项目,通过引入ping-pong缓冲区策略优化接收端的延时问题。文章详细介绍了如何利用两个缓冲区在写入和读取过程中切换,确保数据流畅传输,并通过多线程实现接收、写入和读取的同步。此外,还分享了基于winsock的接收线程实现和主函数的代码片段。
摘要由CSDN通过智能技术生成

最近做一个socket网络传输的项目,在使用TCP进行传输的时候,接收端有时候会因为写入到文件的时间而造成一定的延时,所以在接收端使用了ping-pong buffer的策略进行优化。

所谓ping-pong buffer,也就是定义两个buffer,当有数据进来的时候,负责写入buffer的进程就寻找第一个没有被占用而且可写的buffer,进行写入,写好之后,将占用flag释放,同时设置一个flag提示此buffer已经可读,然后再接下去找另外一个可写的buffer,写入新的数据。

而读入的进程也是一直对buffer状态进行检测,一旦发现没有被占用,而且已经可以被读,就把这个buffer的数据取出来,然后标志为可写。状态的转换关系如下:

status1:可写 full = false; occp = false; 

这时候开始写入,同时改变状态:

status2: 正在写 full = false; occp = true;

写好之后buffer被释放:

status3: 写完了 full = true; occp = false;

而这个状态正是读入线程的开始状态,一旦开始读入,就改变状态

status4: 正在读 full = true; occp = true;

读完了之后:

status1 : full = false; occp = false;

又回到了可以写入的状态。

对于buffer的实现,选择循环链表的形式,一直进行循环检测:

typedef struct listBuf
{
	char * buff;
	int counter;
	bool full;
	bool occp;
	struct listBuf* next;
}lBuf;

提供了创建循环链表和插入新的元素的函数:

void createBuf(lBuf ** rootP)
{
	lBuf * tmp = *rootP;
	tmp->counter = 0;
	tmp->buff = new char[BLOCK_NUM*BUFFERSIZE];
	tmp->next = tmp;
	tmp->full = false;
	tmp->occp = false;
}
void insertBuf(lBuf ** rootP)
{
	lBuf * tmp = new lBuf();
	tmp->counter = 0;
	t
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值