首页 > 编程语言 >C# UDP通信 ReceiveAsync() 一直等待问题

C# UDP通信 ReceiveAsync() 一直等待问题

时间:2024-10-17 09:45:33浏览次数:8  
标签:ReceiveAsync UDP cts C# res Buffer client 服务端 客户端

问题描述

两个C#应用,一个作为服务端Server,另一个作为客户端Client,客户端打开一个Udp端口,循环接收数据;服务端开启后向客户端发送指令,当服务端出现异常时关闭了服务端的UdpClient,此时客户端卡死在_client.ReceiveAsync(),无法再接收到消息。
客户端代码:

try
{
    var cts = new CancellationTokenSource();
    var client = new UdpClient(new IPEndPoint(IPAddress.Any, 10000));
    Task.Run(async () => 
    {
        while (true) 
        {
            await Task.Delay(100, cts.Token).ConfigureAwait(false);
            if (_client != null && _client.Available != 0) 
            {
                if(cts.Token.IsCancellationRequested) break;
                var res = await _client.ReceiveAsync().ConfigureAwait(false);
                if (res.Buffer != null && res.Buffer.Length > 0) 
                {
                    Console.WriteLine(res.Buffer);
                }
            }
        }
    }, cts.Token);
}
catch(Exception e)
{

}

服务端UdpClient关闭后,客户端catch陷入无限等待,且无法捕获到异常,服务端重启后也无法再次接收服务端消息。

解决方案:服务端断开后,客户端会收到远程主机关闭连接的异常,将异常捕获移动到内部,并捕获SocketException异常,当捕获到的异常代码为ConnectionReset时,表示远程主机关闭,不做处理即可,下次服务端重启后可正常连接。

var cts = new CancellationTokenSource();
var client = new UdpClient(new IPEndPoint(IPAddress.Any, 10000));
Task.Run(async () => 
{
    while (true) 
    {
        await Task.Delay(100, cts.Token).ConfigureAwait(false);
        if (_client != null && _client.Available != 0) 
        {
            if(cts.Token.IsCancellationRequested) break;
            try
            {
                var res = await _client.ReceiveAsync().ConfigureAwait(false);
                if (res.Buffer != null && res.Buffer.Length > 0) 
                {
                    Console.WriteLine(res.Buffer);
                }
            } 
            catch (SocketException ex) 
            {
                if(ex.SocketErrorCode == SocketError.ConnectionReset)
                {
                    //远程主机关闭连接
                }
                // 处理接收超时或其他异常
                else Console.WriteLine($"Socket exception: {ex.Message}");
            }
        }
    }
}, cts.Token);

标签:ReceiveAsync,UDP,cts,C#,res,Buffer,client,服务端,客户端
From: https://www.cnblogs.com/zp1207/p/18471425

相关文章

  • CtsBiometricsTestCases 测试fail,解决方法。
    平台:高通C6490,android13测试结果:arm64-v8a CtsBiometricsTestCasesTestResultDetailsandroid.server.biometrics.BiometricActivityTests#testBiometricOrCredential_credentialButtonInvoked_biometricNotEnrolledfailjava.lang.AssertionError:AuthSessionState......
  • 本地运行vercel模板项目vercel/nextjs-postgres-auth-starter
    官方指南链接:https://vercel.com/templates/next.js/prisma-postgres-auth-starter创建项目create-next-appnpxcreate-next-appnextjs-typescript-starter--example"https://github.com/vercel/nextjs-postgres-auth-starter"进入nextjs-typescript-startercdnextj......
  • CtsPermissionTestCases之android.permission.cts.DebuggableTest#testNoDebuggable
    平台:高通C6490,android13测试结果:android.permission.cts.DebuggableTest#testNoDebuggablefailjunit.framework.AssertionFailedError:Packagesmarkeddebuggable:[com.skyworthdigital.autotest.all] 这个问题是该测试对应的app是否有debugable的标签。解决......
  • 常见问题——C#未能找到路径“\bin\roslyn\csc.exe”的一部分
    1.主要原因是因为两个库存在,需要生成一个roslyn文件那么就删除这两个关联的库,就可以达到目的删去项目中的这两天引用:Microsoft.CodeDom.Providers.DotNetCompilerPlatformMicrosoft.Net.Compilers2.删除web.config中加载的这个依赖的代码段<system.codedom><compilers......
  • C#的自定义对话框和提示窗体 - 开源研究系列文章
          上次的应用因为需要用到对话框和提示窗体,然后系统自带的MessageBox界面个人又看不上,所以就想自己编写一个自定义的窗体,于是有了本文,具体的已经应用到笔者其它的应用里了。 1、项目目录;  2、源码介绍;1)实现;        2)......
  • asp.net core 跨域配置不起作用的原因
    1、中间件配置跨域的顺序不对中间件顺序配置对了基本上就能解决大部分问题中间件顺序配置对了基本上就能解决大部分问题附上官网简单的启用跨域的代码varMyAllowSpecificOrigins="_myAllowSpecificOrigins";varbuilder=WebApplication.CreateBuilder(args);build......
  • 在调试网页 JavaScript 脚本时,遇到 Error: Incorrect contents fetched, please reloa
    在调试网页JavaScript脚本时,遇到Error:Incorrectcontentsfetched,pleasereload这样的错误,通常表明网页内容的获取过程出现了问题。这种错误一般与页面加载、缓存管理、网络请求、脚本执行顺序等因素密切相关。为了更详细地分析问题,处理并解决这一错误,下面将从多个......
  • 机器学习(MachineLearning)(8)——模型评估与优化
    机器学习(MachineLearning)(1)——机器学习概述机器学习(MachineLearning)(2)——线性回归机器学习(MachineLearning)(3)——决策树回归机器学习(MachineLearning)(4)---------分类_逻辑回归机器学习(MachineLearning)(5)——分类_决策树机器学习(MachineLearning)(6)——分类_支持向量机机......
  • h3cne-rs+题库GB0-192新华三初级网络工程师认证模拟练习题限时领!
    很高兴你对H3CNE-RS+(GB0-192)新华三初级网络工程师认证感兴趣。为了帮助你备考,以下是一些模拟练习题及解析示例。请注意,这只是部分示例,并非完整的题库。真实的考试题目可能会涉及更多细节和实际应用场景。想要完整题库的,加老师。IP地址132.119.100.200的子网掩码是255.......
  • OpenCV基本操作(python开发)——(1) 读取图像、保存图像
    OpenCV一.OpenCV安装——linux执行以下命令安装opencv-python库(核心库)和opencv-contrib-python库(贡献库)。注意:命令拷贝后要合成一行执行,中间不要换行。#安装opencv核心库pip3install--useropencv-python==3.4.2.16--index-urlhttps://pypi.tuna.tsinghua.edu.cn......