在C#中,当使用Socket进行通信时,可能会遇到异常断开的情况,例如网络中断、对方主机关闭连接等。为了处理这些异常情况,可以使用SocketFlags
枚举来设置套接字选项,以便在接收数据时检测到连接中断。
以下是一个示例,展示了如何使用SocketFlags
来处理异常断开:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// 创建一个IPv4和IPv6地址列表
var addresses = new List<IPAddress> { IPAddress.Any, IPAddress.IPv6Any };
var port = 12345;
// 创建一个可用的端口
var localEndPoint = new IPEndPoint(IPAddress.Any, port);
// 创建一个Socket实例
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
// 绑定套接字到本地地址和端口
socket.Bind(localEndPoint);
// 开始监听连接
socket.Listen(10);
Console.WriteLine("等待客户端连接...");
// 接受客户端连接
using (var client = await socket.AcceptAsync())
{
Console.WriteLine("客户端已连接");
// 设置SocketFlags以检测异常断开
var flags = SocketFlags.Asynchronous;
// 接收数据
try
{
byte[] buffer = new byte[1024];
int bytesReceived = await client.ReceiveAsync(new ArraySegment<byte>(buffer), flags);
if (bytesReceived == 0)
{
// 如果没有接收到任何数据,说明对方已经关闭了连接
Console.WriteLine("对方已断开连接");
}
else
{
// 处理接收到的数据
string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesReceived);
Console.WriteLine($"接收到的数据: {receivedData}");
}
}
catch (SocketException ex)
{
// 如果发生异常,说明连接已经中断
Console.WriteLine($"连接中断: {ex.Message}");
}
}
}
}
}
在这个示例中,我们创建了一个TCP套接字,并设置了SocketFlags.Asynchronous
以便在接收数据时检测到连接中断。当使用ReceiveAsync
方法接收数据时,如果没有接收到任何数据(即bytesReceived
为0),说明对方已经关闭了连接。如果发生其他异常(例如SocketException
),说明连接已经中断。