C#写一个UDP程序判断延迟并运行在Centos上

保姆级教程:用CentOS 7和ztncui搭建私有ZeroTier Planet服务器(附常见问题排查) 本文提供了一份详细的CentOS 7环境下搭建私有ZeroTier Planet服务器的保姆级教程,涵盖环境准备、核心服务部署、可视化管控平台配置及多平台客户端接入实战。特别针对国内网络环境优化传输效率,并附常见问题排查指南,帮助用户快速构建安全稳定的私有虚拟局域网。 阅读详情

服务端


using System.Net.Sockets;
using System.Net;


int serverPort = 50001;
Socket server;
EndPoint client = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号

CreateSocket();

void CreateSocket()
{
    server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    IPAddress ip = IPAddress.Any;
    server.Bind(new IPEndPoint(ip, serverPort));//绑定端口号和IP
    Console.WriteLine("服务端已经开启,监听端口:"+ serverPort);
    Thread t = new Thread(ReciveMsg);//开启接收消息线程
    t.Start();

}

/// <summary>
/// 接收发送给本机ip对应端口号的数据报
/// </summary>
void ReciveMsg()
{
    byte[] buffer = new byte[1024];
    byte[] sendbuffer= new byte[20];
    while (true)
    {
        
        Console.WriteLine("等待接收数据 ...");
        int length = server.ReceiveFrom(buffer, ref client);//接收数据报
        try
        {
            int no = BitConverter.ToInt32(buffer, 0);
            long getd = BitConverter.ToInt64(buffer, 4);

            //string message = Encoding.UTF8.GetString(buffer, 0, length);
            Console.WriteLine(client.ToString() + " : " + no + "," + getd);

			int sz = 0;
            int offset = 0;
            byte[] bno = BitConverter.GetBytes(no);
            sz = 4;
            Array.Copy(bno, 0, sendbuffer,offset, sz);
            offset += sz;
            bno = BitConverter.GetBytes(getd);
            sz = 8;
            Array.Copy(bno, 0, sendbuffer, offset, sz);
       
            server.SendTo(sendbuffer, client);
        }
        catch
        {
            Console.WriteLine("error."+ client.ToString()+","+ buffer.Length.ToString());
        }
    }
}

在这里插入图片描述

注意下端口号,可以使用下面的命令查看是否被占用

netstat -alnp |grep 50001

如果没输出代表没有被使用,注意防火墙开启udp的端口

客户端

#define WLOG

using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Diagnostics;

string serverIp = "192.168.3.76";
int serverPort = 50001;
int lost = 0;   //丢包率
long ping = 0;

Socket client;
EndPoint server;
int sendno = 0; //连续编号



int lostcount = 10;  //丢包百分比数组
int[] losts = new int[lostcount];

EndPoint recivePoint = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
CreateClient();




void CreateClient()
{
    for (int i = 0; i < lostcount; i++)
        losts[i] = 1;

    client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    client.Bind(new IPEndPoint(IPAddress.Any, 0));

    server = new IPEndPoint(IPAddress.Parse(serverIp), serverPort);

    Thread t = new Thread(sendMsg);
    t.Start();

    Thread t2 = new Thread(ReciveMsg);
    t2.Start();
}


void Send()
{
    //发包格式#0编号,1时间
    long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();
    List<byte> byteSource = new List<byte>();
    byteSource.AddRange(BitConverter.GetBytes(sendno));
   
    byte[] tick = BitConverter.GetBytes(milliseconds);
    byteSource.AddRange(tick);
    //byte[] sendata = milliseconds.tob Encoding.UTF8.GetBytes("unity hellp");
    byte[] data = byteSource.ToArray();

    client.SendTo(data, server);

    
    losts[sendno % lostcount] = 0;

    sendno++;

    Console.WriteLine("data:"+ milliseconds.ToString()+ ",lost:"+ lost+"%");
}
/// <summary>
/// 向特定ip的主机的端口发送数据报
/// </summary>
void sendMsg()
{

    while (true)
    {
        Send();
        Thread.Sleep(500);
        ComputLost();
        Thread.Sleep(500);
    }
}

void ComputLost()
{
    int all = 0;
    for (int i = 0; i < lostcount; i++)
    {
        if (losts[i] == 0)
            all++;
    }
    lost = (int)(all * 100.0 / lostcount);
}

/// <summary>
/// 接收发送给本机ip对应端口号的数据报
/// </summary>
void ReciveMsg()
{
    byte[] buffer = new byte[1024];
    while (true)
    {
        try
        {
            int length = client.Receive(buffer);//, ref recivePoint);//接收数据报

            int no = BitConverter.ToInt32(buffer, 0);
            long getd = BitConverter.ToInt64(buffer, 4);

           
            long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();
            ping = milliseconds - getd;
            losts[no % lostcount] = (int)ping+1;
           
            Console.WriteLine(recivePoint.ToString() + " , no : " + no + " , getd : " + getd + " , ping : " + ping);
        }
        catch(Exception e) 
        {
            Console.WriteLine(e.ToString());
        }
    }
}


其中ping就是发包返回的时间。lost都是发10个包丢了几个。
在这里插入图片描述

在Centos部署

把代码拷贝到centos目录下
在这里插入图片描述
如果没安装dotnet,我们安装运行时就可以了

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

sudo yum install dotnet-runtime-7.0

如果直接运行,可以输入

dotnet PingServer.dll

创建服务开机启动

vim /etc/systemd/system/pingserver.service

内容如下

[Unit]
Description=pingserver for centos7

[Service]
WorkingDirectory=/home/pingserver/Release
ExecStart=/usr/bin/dotnet /home/pingserver/Release/PingServer.dll
Restart=always
RestartSec=10  # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-pingserver
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

可以设置开机启动

systemctl enable pingserver.service

开启和状态

systemctl start pingserver.service
systemctl stop pingserver.service
systemctl status pingserver.service

查看运行日志可以

journalctl -u pingserver.service

显示最近20条
journalctl -u pingserver -n 20

还可以通过其他参数显示需要的,journalctl --help
例如从某个时间开始 
journalctl -u pingserver -S "2023-10-27 11:30:00"
journalctl -u pingserver -S "11:30:00"


注意配置文件如果在windows下编辑,记得换行符要改成LF(unix)格式的utf8才可以。

Unity3D MMORPG状态同步:从权威服务器到客户端预测的实战解析 在实时多人在线游戏开发中,网络同步是确保游戏世界一致性与流畅体验的核心技术。其基本原理在于,服务器作为游戏逻辑的唯一权威源,负责计算和验证所有关键状态,而客户端则负责渲染和即时响应玩家输入。为了在网络延迟下实现快速响应,客户端预测技术应运而生,它允许客户端在等待服务器确认前先行模拟操作,再根据服务器返回的权威状态进行平滑纠错。这种技术方案在MMORPG这类强交互、重逻辑且对防作弊要求极高的游戏中具有关键价值,它能有效调和实时性与一致性之间的矛盾,是构建大规模、稳定在线虚拟世界的基石。本文聚焦于Unity3D 阅读详情

相关推荐

ICE中间件实战:从零部署到多语言联调的全链路指南

ICE是一种面向服务架构(SOA)的高性能RPC中间件,其核心在于通过Slice接口定义实现跨语言契约治理与位置透明通信。它基于原生TCP协议和二进制零拷贝序列化,相比REST/HTTP在延迟(0.8ms vs 15.6ms)和吞吐量上具备数量级优势,特别适用于金融清算、实时风控等低延迟场景。技术价值体现在编译期强契约约束、运行时ObjectAdapter统一调度、以及Proxy/Skeleton分层解耦设计。典型应用场景包括PHP与C++混合服务治理、数据库访问集中化封装、微服务间确定性通信。本文聚焦IC

baochuanying9531的博客 419

在Centos7上运行c#控制台应用

官方网站: https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos 安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加 Microsoft 包存储库。 打开终端并运行以下命令: sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm 安装 SDK .NET SDK

weixin_45738196的博客 1967

微信小程序HTTPS抓包实战:从原理到破解,解决502 Bad Gateway等网络难题

HTTP/HTTPS抓包是网络调试与安全分析的核心技术,其本质在于截获并解析设备与服务器间的通信数据。HTTP协议采用明文传输,数据可被中间节点直接读取;而HTTPS通过SSL/TLS协议对传输层进行加密,保障了数据安全,但也增加了调试复杂度。抓包工具通过模拟中间人攻击原理,在客户端安装自签名根证书,从而解密HTTPS流量,为开发者提供了调试接口、分析性能、排查线上问题的强大能力。在移动开发、特别是微信小程序这类强制HTTPS且运行环境特殊的场景中,常规抓包手段常因证书绑定等问题失效。本文聚焦于解决此类难题

weixin_34122810的博客 810

【Linux】CentOS7 C#开发环境搭建笔记(软件清单)

由于C#开发的项目需要部署在Linux系统上运行,在开发Java项目,CentOS是非常好的Linux系统,因此以CentOS7为主,现开始学习记录如何在CentOS7下搭建C#开发环境。 软件清单 序号 软件 版本 官网 备注 1 Jexus 6.1 x64 专业版 https://www.jexus.org/ 替代IIS部署Web中间件 2 MonoDevelop 7.6....

姜太小白的博客 1995

Unity实时驱动Avatar:基于REST API与云端动捕数据的实践指南

在实时3D应用开发中,如何高效驱动虚拟角色(Avatar)的动画是核心技术挑战之一。传统方案依赖本地动画资源或昂贵的硬件动捕设备,存在制作成本高、流程复杂等问题。随着云计算与网络技术的发展,通过API获取并应用实时动作数据成为新的解决方案。其原理是将动作生成与解算等高性能计算置于云端,客户端通过网络请求获取标准化的骨骼数据(如旋转四元数),并映射到本地渲染引擎的骨骼系统上。这种架构的价值在于实现了计算与渲染的分离,降低了终端设备的性能门槛,并提升了动画资源的可复用性与实时性。典型的应用场景包括虚拟直播、在线

weixin_30924239的博客 525

ToDesk自启动功能全平台配置指南与问题排查

远程控制软件的自启动功能是实现无人值守运维的关键技术,其原理是通过系统级服务注册确保程序随操作系统启动自动运行。在Windows系统中可通过注册表、启动文件夹或任务计划程序实现,Linux依赖systemd服务管理,macOS则使用LaunchDaemons机制。作为国产远程控制工具代表,ToDesk的跨平台自启动配置涉及权限管理、依赖库加载等核心技术点,特别在企业级应用中需考虑多用户环境适配和网络策略配置。实际部署时常见libpng等依赖库缺失问题,通过systemd的Watchdog功能可有效提升服务稳

weixin_30615767的博客 367

C#网络编程之---TCP协议的同步通信(二)

上一篇学习日记C#网络编程之--TCP协议(一)中以服务端接受客户端的请求连接结尾既然服务端已经与客户端建立了连接,那么沟通通道已经打通,载满数据的小火车就可以彼此传送和接收了。现在让我们来看看数据的传送与接收 先把服务端与客户端的连接代码敲出来 服务端 IPAddress ip = new IPAddress(new byte[] { 127, 1, 1, 1 }); TcpList...

weixin_34004576的博客 189

云服务器搭建游戏私服:从零到一实战指南

在云计算时代,云服务器凭借其弹性伸缩、高可用性和免运维特性,已成为部署各类应用服务的首选平台。其核心原理在于通过虚拟化技术,将计算、存储和网络资源池化,为用户提供可按需取用的IT基础设施。对于游戏服务端部署而言,云服务器的价值在于解决了传统物理服务器在公网IP、电力保障和网络稳定性等方面的痛点,尤其适合对持续运行要求高但初期访问量可控的场景,如游戏私服搭建。通过可视化面板工具,可以大幅简化Linux环境配置、软件安装和防火墙设置等复杂操作,实现快速部署。本文聚焦于利用云服务器和宝塔面板,从服务器选购、环境配

chutisun0039的博客 395

c# 网页 linux部署,C#编程之在CentOS中部署C#命令行程序开发环境

本文主要向大家介绍了C#编程之在CentOS中部署C#命令行程序开发环境,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。为了赶时髦,体验下.netcore,特在Linux下部署个开发环境安装VSCode工具(VisualStudioCode)#添加源sudorpm--importhttps://packages.microsoft.com/keys/microsoft.as...

weixin_42298778的博客 737

Unity启动依赖检测:进程监控与优雅退出机制实现

在软件工程中,进程间通信与依赖管理是构建稳定应用系统的关键技术基础。其核心原理在于通过操作系统提供的进程管理接口,实时监控特定进程的生命周期状态,确保关键服务或组件的可用性。这一技术对于保障多进程协作系统的稳定性具有重要价值,尤其在游戏开发、工业仿真等需要硬件驱动或外部服务支持的场景中。通过C#的System.Diagnostics命名空间,开发者可以跨平台实现进程检测功能,结合Unity的生命周期管理,能够在应用启动阶段完成依赖验证。当检测到必需的外部程序未运行时,系统可触发优雅退出流程,并给出明确用户提

weixin_34293911的博客 296

TCPdump网络抓包实战:从命令行到深度诊断的进阶指南

网络数据包分析是网络工程师和运维人员诊断问题、优化性能的核心技能。其原理是通过捕获网络接口上的原始数据流,解析TCP/IP协议栈各层头部信息,从而洞察网络通信的细节。掌握这项技术对于定位连接故障、分析性能瓶颈、调试应用协议以及调查安全事件具有不可替代的价值。在实际生产环境中,尤其是在无图形界面或资源受限的服务器、云端虚拟机及嵌入式设备上,命令行抓包工具展现出其独特优势。本文聚焦于TCPdump这一经典工具,深入讲解其安装部署、核心过滤语法,并结合网络连通性、性能抖动等典型场景,演示如何通过分析TCP握手、重

weixin_34209851的博客 553

CentOS 8 firewalld 核心原理与生产级配置实践

防火墙(firewall)是保障 Linux 系统网络安全的基础组件,其核心在于策略模型设计而非简单端口开放。firewalld 采用区域(zone)、服务(service)、富规则(rich rule)三层抽象,实现默认拒绝、显式放行的安全策略范式。相比传统 iptables,它通过运行时(runtime)与永久(permanent)双态机制提升变更安全性,但也要求工程师深入理解 zone 的信任边界语义、service 文件的协议栈级定义能力,以及 rich rule 的声明式条件表达。该模型广泛应用于

weixin_33895657的博客 495

企业级漏洞扫描平台GVM安装配置与Metasploit联动实战指南

漏洞扫描是网络安全评估与风险管理的核心技术环节,其原理是通过自动化脚本模拟攻击行为,探测网络资产中存在的已知安全弱点。这项技术的核心价值在于能够系统性地发现从操作系统到应用服务的潜在风险,为安全团队提供持续的风险可见性。在实际的工程实践中,开源漏洞管理平台GVM(Greenbone Vulnerability Management,前身为OpenVAS)凭借其庞大的漏洞测试脚本库,成为构建企业级自动化安全检测体系的热门选择。结合渗透测试框架Metasploit进行漏洞验证,可以形成从“发现”到“验证”的完整

weixin_30906185的博客 428

Unity多人游戏开发:基于Mirror的网络同步与Linux服务器部署实践

网络同步是多人游戏开发的核心技术,它通过权威服务器模式解决多客户端状态一致性问题。其原理在于建立客户端-服务器架构,由服务器作为唯一状态仲裁者,通过同步变量和远程过程调用机制,确保所有玩家看到相同的游戏世界。这项技术的价值在于保障游戏公平性、防止作弊,并为大规模在线游戏提供基础。在应用场景上,无论是MOBA、FPS还是MMORPG,都依赖稳健的网络同步实现实时交互。本文以Mirror网络组件为例,深入解析如何构建权威服务器架构,并详细演示将Unity游戏服务器部署到Linux环境的完整流程,涵盖从同步逻辑实

weixin_34025051的博客 364

Unity多人游戏Linux服务器部署实战:基于Mirror网络同步的完整方案

在多人游戏开发中,网络同步和服务器部署是决定项目成败的关键环节。很多开发者,尤其是学生和独立开发者,在尝试将本地运行的Unity多人游戏部署到Linux服务器时,常常会遇到网络配置复杂、同步不稳定、服务器环境搭建困难等问题。本文将以一个实际的实习项目为例,系统性地讲解如何利用Mirror网络组件,将一个具备完整网络同步功能的Unity游戏,从开发环境打包、配置,最终部署到Linux服务器上,并实现稳定运行。整个过程涵盖了从Unity编辑器内的网络编程到Linux服务器的运维实践,无论你是正在准备实习作品集的

weixin_33671935的博客 468

代号OneNET02 STM32+ESP8266 WIFI系列-第2节-STM32单片机通过ESP8266连接WIFI访问OneNET OTA服务器实现SOTA远程程序升级

第2节-STM32单片机通过ESP8266连接WIFI访问OneNET OTA服务器实现SOTA远程程序升级,这一节主要是实现通过OneNET OTA服务器将需要更新的程序远程下载到STM32单片机,这一节主要是引导程序和应用程序的讲解。

weixin_44862509的博客 1904

Unity网络游戏Linux服务器部署实战:Mirror组件与Headless模式

网络同步是构建多人在线游戏的核心技术,它通过客户端与服务器之间的数据交换,确保所有玩家在虚拟世界中看到一致的游戏状态。其原理通常基于状态同步或帧同步,技术价值在于为玩家提供实时互动体验,是MMO、MOBA等游戏类型的基石。在工程实践中,开发者需要选择合适的网络库并完成服务端部署,才能让游戏从本地测试走向线上服务。Mirror作为Unity的高层网络API,封装了底层连接与RPC调用,显著降低了开发门槛。而将游戏服务器部署至Linux环境,则是实现稳定线上服务的关键步骤,涉及Headless模式构建、进程守护

weixin_30307921的博客 452

【Dify精讲】第2章:后端服务架构深度剖析

Dify后端采用Flask应用工厂模式实现模块化开发,通过蓝图架构将API分为控制台、Web应用和服务接口三大模块。其设计亮点包括:1) 应用工厂模式支持多环境配置和独立测试;2) 蓝图分层管理实现API模块化,各模块职责清晰;3) 严格遵循RESTful原则设计API接口;4) 使用Flask-RESTful扩展简化API开发。这种架构既保持了Flask的灵活性,又实现了企业级应用的可维护性,是Flask项目架构的优秀实践案例。

wiyi9891的专栏 2126

Unity多人游戏服务器部署:基于Mirror与Linux的完整实践指南

网络同步是多人联机游戏开发的核心挑战,其本质在于通过客户端-服务器模型在多个客户端间维持游戏状态的一致性。这一原理催生了多种网络同步技术方案,旨在解决延迟、作弊与状态同步等工程难题。对于Unity开发者而言,选择合适的网络库与部署环境是实现稳定、可扩展多人游戏服务的关键技术价值所在。Mirror作为高性能开源网络库,通过提供直观的API降低了开发门槛,而Linux服务器则以其稳定性与低资源开销成为服务端部署的标准环境。结合两者,开发者能够构建从本地测试到线上服务的完整链路,尤其适用于需要部署到云服务器、实现

weixin_30216561的博客 479

边云协同智能进化:大模型与小模型的动态训练与高效部署策略

本文深入探讨了边云协同架构下大模型与小模型的动态训练与高效部署策略。通过物流分拣、医疗影像等实战案例,展示了如何利用边云协作框架实现AI模型的智能进化,显著提升处理效率与准确性。重点解析了动态任务分配、增量学习和知识蒸馏等关键技术,为分布式训练场景提供优化方案。

work3的博客 191

高效爬取懂车帝车型数据:从静态解析到动态反爬实战

本文详细解析了如何高效爬取懂车帝车型数据,从静态HTML解析到动态接口反爬的完整实战路径。文章重点介绍了使用浏览器开发者工具定位数据、应对CSS混淆与参数加密等反爬策略,并提供了整合静态与动态抓取逻辑的Python代码示例,帮助开发者稳健地获取结构化车型信息。

wind6的博客 937
上一篇: KBEngine增加ThinkingData打点
下一篇: C#下使用IronPython来实现热更新
Thinbug
博客等级 码龄22年 2万+粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值