C# Socket 读写数据判断连接状态

官方中提到关于Socket Connected属性说明:

属性 Connected 获取自上次 I/O 操作起的连接状态 Socket 。 当它返回 false时, Socket 要么从未连接,要么不再连接。 Connected不是线程安全;当 从另一个线程断开连接时,操作中止后,Socket它可能会返回 true 。

所以不能简单的通过Connected 属性去判断Socket 的连接状态是否正常。 建议通过如下方式:

1. 判断可读:

使用Poll 的Selected.SelectRead ,官方说明:

  • 对于 SelectRead,如果已调用且连接处于挂起状态、数据可供读取,或者连接已关闭、重置或终止,则返回 true;

如果SelectRead 模式是true 既可以表示正在连接且有数据可供读取,又可以表示连接关闭、重置或终止,所以关键在于需要判断数据是否可供读取。个人觉得不要用Available 属性判断,官方说明:

如果使用非阻止 Available ,是在调用 Receive之前确定数据是否排队读取的好方法。 可用数据是在网络缓冲区中排队以供读取的数据总量。 如果网络缓冲区中没有排队的数据, Available 则 返回 0。

从上可以看出,Available 是在缓冲区排队等待读取的数据总量,如果当Server端本就是暂无数据推送,Available 返回 0,但此时也不能表明连接是中断的 ,所以无法喝SelectRead 一并判断出连接异常。 个人建议采用Receive 判断读到的数据长度为0 时,再根据Poll 的SelectRead 模式是否true 来判断连接中断。如下:

while (socket.Connected) 
{
    byte[] buffer = new byte[bufferSize];
    int len = socket.Receive(buffer);
    if (len == 0)
    {
       if (socket.Poll(0, SelectMode.SelectRead))
       {
           break;
       }
       continue;
    }
}

2. 判断可写:

这个就比较简单了,可以通过Poll 的SelectWrite 模式判断,官方说明:

对于 SelectWrite,如果处理 Connect 且连接成功,或者可以发送数据,则返回 true 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值