C# 清空Receive() 接收缓存区

本文讨论了在物联网设备数据采集过程中,如何通过控制命令来开始和停止采集,以及如何处理TCP协议中可能存在的过时数据,介绍了两种方法:一是设置接收缓冲区接收操作的超时时间以清理未使用数据,二是通过断开并重新连接socket来清除缓存中的过期数据。
摘要由CSDN通过智能技术生成

在控制物联网设备采集数据时,使用开启命令,开始采集;停止命令,停止采集。此为一次采集。
但若一次采集的过程中,未能处理所有的数据,则TCP协议可能将之保存,成为过时数据;下次采集时,此数据被Receive()函数接收,使得数据出错。
故需要清理缓存区。

前期准备工作

前期准备工作可能有:

string ip = "192.168.2.2";
int port = 10000;
IPAddress ipAdress = IPAddress.Parse(ip);           // 绑定服务器IP、端口
EndPoint point = new IPEndPoint(ipAdress, port);
tcpConn.Connect(point);                             // 尝试连接

方法1 消耗掉缓存区中的数据

tcpConn表示一个tcp连接。正常流程的接收-处理数据暂不做演示。

// 控制接收操作的阻塞时间,防止程序无限期等待,进行后续的异常处理。
tcpConn.ReceiveTimeout = 3000;  // 设置超时时间为3秒,防止长期阻塞

/// <summary>
/// 清空接收缓冲区中未使用的数据
/// </summary>
internal void CleanRecvBuff()
{
    try
    {
        byte[] buffer = new byte[tcpConn.ReceiveBufferSize];	// 创建一个足够大(接收缓冲区大小:65535)的字节数组           
        int len = tcpConn.Receive(buffer);                  	// 将字节数组填满,清理缓冲区
        Console.WriteLine("清理Receive系统缓存区{0}字节数据", len);
    }
    catch (Exception)
    {
        throw new Exception("清理Receive系统缓存区时无可清理数据");
    }
}

方法2 断开连接

先断开Socket连接,然后再次重连,以清除过时数据。

/// <summary>
/// 废弃已有连接
/// 防止上次扫码信息的干扰
/// 清空接收缓冲区中未使用的数据
/// </summary>
public void AbandonConn()
{
    if (tcpConn is null) { return; }        // 如果未连接,则不处理
    tcpConn.Shutdown(SocketShutdown.Both);  // 向对端发送一个FIN包以表明不再接收数据
    tcpConn.Close();                        //先关闭客户端
    tcpConn.Dispose();                      // 释放资源
    tcpConn = null;
    Console.WriteLine("与相机的连接已废弃!");
}
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值