Delphi中关于TCP通讯,Indy粘数据包问题

 

发送端创建一个发送缓冲区,用 AddSendBuffer(AData:Pointer;ALen:Integer) 的方式将用户数据包加入到缓冲区.用另一个线程,从缓冲区的另一头取定长,比如说是 1024字节点长度的数据,加上包头形成一个发送数据包。
接收端也是创建一个接收缓冲区,将收到的每个发送数据包中的用户数据都按顺序放在缓冲区中。一个线程根据数据内容来确定是否接收完成一个用户数据包。完成后就给上层应用程序发一个消息。应用程序取到数据后将缓冲区中的对应数据删除。

缓冲区中数据头的位置 画错了,应该在绿色的后面。在要加数据就加到绿色的后面,如果缓冲区满了,就从头开始,如果前面也没有空位了,就将缓冲区扩大,或暂停向缓冲区中加数据。

上面是发送缓冲区,里面的每个颜色是用户数据包。
发送线程只按固定的大小A 从缓冲区中取数据,加上顺序号和数据大小A(如果最后缓冲区数据大小比A小,则保存实际的数据大小),形成发送数据包。

接收端收到数据后,检查收到的数据中有多少个发送数据包,将数据包中的数据按顺序放在接收缓冲区中,如果发送数据包让截断了,则等一下个接收事件中取得后面的内容。

检查到形成了一个用户数据包了,则给上层应用发消息。

里面主要用户的就是内存指针的移动,复制,删除的操作。缓冲区其实是个循环队列。

要注意在向缓冲区添加数据的时候要用临界区进行锁定,因为同时发送线程还在读取数据。
接收缓冲区也是同样的。
将发送缓冲区和接收缓冲区和实现成一类使用就更方便了。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值