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

在控制物联网设备采集数据时,使用开启命令,开始采集;停止命令,停止采集。此为一次采集。
但若一次采集的过程中,未能处理所有的数据,则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秒,防止长期阻塞

/// 
/// 清空接收缓冲区中未使用的数据
/// 
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连接,然后再次重连,以清除过时数据。

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

你可能感兴趣的:(笔记,C#项目,c#,tcp/ip)