在控制物联网设备采集数据时,使用开启命令,开始采集;停止命令,停止采集。此为一次采集。
但若一次采集的过程中,未能处理所有的数据,则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("与相机的连接已废弃!");
}