惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
V
V2EX
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
小众软件
小众软件
Vercel News
Vercel News
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
J
Java Code Geeks
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog
B
Blog
美团技术团队
量子位

博客园 - 网络来者

Element Plus 多页面后台与 ASP.NET Core API 从零手敲教程 从零创建 MESTOOLS 消息弹窗跟练教程 uni app开发一个子页面 MES物料分摊 墨西哥 嘉兴 兼容车牌摄像头 和 tplink 摄像头的sdk开发包 集成 训练数字识别模型 tplink摄像头监控 mes测试机 redis vue学习 vue 系统文件结构 第一个服务 c# 开发相关 openclaw 安装 c# 版本号 oracle 触发器 脚本方式安装Python 特定版本 idea 激活 Chrome MCP Server mcp ok mcp_server RepositoryItemGridLookUpEdit 使用 ok devexpress gridcontrol表格知识 winfrom 弹文本框 松下贴片机解锁 Serilog日志组件使用 git 使用
udp server 监听服务
网络来者 · 2026-03-31 · via 博客园 - 网络来者
using System;
using System.Net;
using System.Net.Sockets;
using System.ServiceProcess;
using System.Threading;
using System.Threading.Tasks;

namespace MyDelayService
{
    public partial class DelayTaskService : ServiceBase
    {
        private Task _udpListenerTask;
        private CancellationTokenSource _cts;

        // UDP 监听端口(可自己改)
        private readonly int _udpPort = 8888;
        private UdpClient _udpServer;

        public DelayTaskService()
        {
            InitializeComponent();
            ServiceName = "MyUdpEchoService";
        }

        protected override void OnStart(string[] args)
        {
            WriteLog("===== UDP 回声服务已启动 =====");

            _cts = new CancellationTokenSource();
            _udpListenerTask = RunUdpEchoServerAsync(_cts.Token);
        }

        protected override void OnStop()
        {
            WriteLog("===== 服务正在停止 =====");
            _cts?.Cancel();
            _udpServer?.Close();
            _udpListenerTask?.Wait();
            WriteLog("===== 服务已停止 =====");
        }

        /// <summary>
        /// UDP 回声服务端:收到什么就原样发回什么
        /// </summary>
        private async Task RunUdpEchoServerAsync(CancellationToken token)
        {
            try
            {
                _udpServer = new UdpClient(_udpPort);
                WriteLog($"UDP 监听端口:{_udpPort}");

                while (!token.IsCancellationRequested)
                {
                    try
                    {
                        // 等待客户端消息
                        var result = await _udpServer.ReceiveAsync();
                        byte[] clientData = result.Buffer;
                        IPEndPoint clientEp = result.RemoteEndPoint;

                        string msg = System.Text.Encoding.UTF8.GetString(clientData);
                        WriteLog($"【接收】{clientEp.Address}:{msg}");

                        // ======================
                        // 关键:原样返回给客户端
                        // ======================
                        await _udpServer.SendAsync(clientData, clientData.Length, clientEp);
                        WriteLog($"【返回】{clientEp.Address}:{msg}");
                    }
                    catch (Exception ex)
                    {
                        if (!token.IsCancellationRequested)
                            WriteLog($"UDP 异常:{ex.Message}");
                    }
                }
            }
            catch (Exception ex)
            {
                WriteLog($"UDP 服务失败:{ex.Message}");
            }
        }

        /// <summary>
        /// 写日志
        /// </summary>
        public void WriteLog(string msg)
        {
            try
            {
                XLog.XTrace.WriteLine(msg);
            }
            catch { }
        }
    }
}

posted @ 2026-03-31 10:44  网络来者  阅读(4)  评论()    收藏  举报