Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

c# socket 判断连接状态

作者:城若幻影   发布日期:2025-12-17   浏览:113

using System;
using System.Net.Sockets;

public class SocketConnectionChecker
{
    public static bool IsSocketConnected(Socket socket)
    {
        // 检查是否已经关闭
        if (socket == null || !socket.Connected)
        {
            return false;
        }

        // 通过轮询套接字的属性来检查连接状态
        bool blockingState = socket.Blocking;
        try
        {
            byte[] buffer = new byte[1];
            socket.Blocking = false;
            int receivedBytes = socket.Receive(buffer);

            // 如果接收到的数据为0,表示连接已关闭
            if (receivedBytes == 0)
            {
                return false;
            }
        }
        catch (SocketException ex)
        {
            // 10035 表示 WSAEWOULDBLOCK,即没有数据可读取
            if (ex.SocketErrorCode != SocketError.WouldBlock &&
                ex.SocketErrorCode != SocketError.IOPending &&
                ex.SocketErrorCode != SocketError.NoBufferSpaceAvailable)
            {
                return false;
            }
        }
        finally
        {
            socket.Blocking = blockingState;
        }

        return true;
    }
}

解释说明

  1. 检查是否已经关闭

    • 首先检查 socket 是否为 null 或者 Connected 属性是否为 false。如果是,则返回 false,表示连接已关闭。
  2. 轮询套接字的属性

    • 将套接字设置为非阻塞模式 (Blocking = false),尝试接收一个字节的数据。
    • 如果接收到的数据为 0,表示对端已经关闭了连接,返回 false
  3. 处理异常情况

    • 捕获 SocketException 异常,判断错误码是否为 WSAEWOULDBLOCK(10035),IOPendingNoBufferSpaceAvailable。这些错误码表示当前没有数据可读取,但连接仍然有效。
    • 如果是其他类型的错误,则返回 false,表示连接可能已经断开。
  4. 恢复原始状态

    • 最后将套接字的阻塞模式恢复到原来的设置。

这个方法可以较为准确地判断一个 Socket 连接是否仍然有效。

上一篇:c#删除文件夹

下一篇:c#字符串数组

大家都在看

c# 二进制

c# datatable group by

c# tcp client

c# type.gettype

c# sqlconnection

c# string.format 小数位数

.net和c#

c#获取系统时间

c#游戏开发

c#网络编程

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站