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;
}
}
检查是否已经关闭:
socket 是否为 null 或者 Connected 属性是否为 false。如果是,则返回 false,表示连接已关闭。轮询套接字的属性:
Blocking = false),尝试接收一个字节的数据。0,表示对端已经关闭了连接,返回 false。处理异常情况:
SocketException 异常,判断错误码是否为 WSAEWOULDBLOCK(10035),IOPending 或 NoBufferSpaceAvailable。这些错误码表示当前没有数据可读取,但连接仍然有效。false,表示连接可能已经断开。恢复原始状态:
这个方法可以较为准确地判断一个 Socket 连接是否仍然有效。
上一篇:c#删除文件夹
下一篇:c#字符串数组
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站