当前位置: 首页 > news >正文

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

服务端


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));//绑定端口号和IPConsole.WriteLine("服务端已经开启,监听端口:"+ serverPort);Thread t = new Thread(ReciveMsg);//开启接收消息线程t.Start();}/// <summary>
/// 接收发送给本机ip对应端口号的数据报
/// </summary>
void ReciveMsg()
{byte[] buffer = new byte[1024];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);server.SendTo(buffer, client);}catch{Console.WriteLine("error."+ client.ToString()+","+ buffer.Length.ToString());}}
}

在这里插入图片描述

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

netstat -alnp |grep 50001

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

客户端

#define WLOGusing 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.rpmsudo 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

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

相关文章:

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

服务端 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, SocketT…...

Kafka核心原理第二弹——更新中

架构原理 一、高吞吐机制&#xff1a;Batch打包、缓冲区、acks 1. Kafka Producer怎么把消息发送给Broker集群的&#xff1f; 需要指定把消息发送到哪个topic去 首先需要选择一个topic的分区&#xff0c;默认是轮询来负载均衡&#xff0c;但是如果指定了一个分区key&#x…...

巨人互动|游戏出海H5游戏出海规模如何?

H5游戏出海是指将H5游戏推广和运营扩展到国外市场的行为&#xff0c;它的规模受到多个因素的影响。本文小编讲一些关于H5游戏出海规模的详细介绍。 1、市场规模 H5游戏出海的规模首先取决于目标市场的规模。不同国家和地区的游戏市场规模差异很大&#xff0c;有些市场庞大而成…...

【爬虫】实验项目三:验证码处理与识别

目录 一、实验目的 二、实验预习提示 三、实验内容 实验要求 基本要求&#xff1a; 改进要求A&#xff1a; 改进要求B&#xff1a; 四、实验过程 基本要求 五、源码如下 六、资料 一、实验目的 部分网站可能会使用验证机制来阻止用户无效登录或者是验证用户不是用程…...

广东成人高考报名将于9月14日开始!

截图来自广东省教育考试院官网* 今年的广东成人高考正式报名时间终于确定了&#xff01; 报名时间&#xff1a;2023年 9 月14—20日 准考证打印时间&#xff1a;考前一周左右 考试时间&#xff1a;2023年10月21—22日 录取时间&#xff1a;2023年12 月中上旬 报名条件: …...

pytorch中文文档学习笔记

先贴上链接 torch - PyTorch中文文档 首先我们需要安装拥有pytorch的环境 conda指令 虚拟环境的一些指令 查看所有虚拟环境 conda info -e 创建新的虚拟环境 conda create -n env_name python3.6 删除已有环境 conda env remove -n env_name 激活某个虚拟环境 activate env…...

element-ui全局导入与按需引入

全局引入 npm i element-ui -S 安装好depencencies里面可以看到安装的element-ui版本 然后 在 main.js 中写入以下内容&#xff1a; import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue;Vue.…...

go 地址 生成唯一索引v2 --chatGPT

问&#xff1a;golang 函数 getIndex(n,addr,Hlen,Tlen) 返回index。参数n为index的上限&#xff0c;addr为包含大小写字母数字的字符串,Hlen为截取addr头部的长度&#xff0c;Tlen为截取addr尾部的长度 gpt: 你可以编写一个函数来计算根据给定的参数 n、addr、Hlen 和 Tlen …...

JSON XML

JSON&#xff08;JavaScript Object Notation&#xff09;和XML&#xff08;eXtensible Markup Language&#xff09;是两种常用的数据交换格式&#xff0c;用于在不同系统之间传输和存储数据。 JSON是一种轻量级的数据交换格式&#xff0c;它使用易于理解的键值对的形式表示数…...

2023年MySQL实战核心技术第四篇

七 . 吃透索引&#xff1a;...

cmake编译(qtcreator)mingw下使用的osg3.6.5

官网下载osg3.6.5源码&#xff0c;先不使用依赖库&#xff0c;直接进行编译 如果generate后报错&#xff0c;显示找不到boost必须库&#xff0c;则手动增加路径。然后先在命令行中使用mingw32-make&#xff0c;如果显示不存在&#xff0c;则需要去环境变量里配置一下这个工具的…...

Python钢筋混凝土结构计算.pdf-混凝土强度设计值

计算原理&#xff1a; 需要注意的是&#xff0c;根据不同的规范和设计要求&#xff0c;上述公式可能会有所差异。因此&#xff0c;在进行混凝土强度设计值的计算时&#xff0c;请参考相应的规范和设计手册&#xff0c;以确保计算结果的准确性和合规性。 代码实现&#xff1a; …...

elasticsearch的索引库操作

索引库就类似数据库表&#xff0c;mapping映射就类似表的结构。我们要向es中存储数据&#xff0c;必须先创建“库”和“表”。 mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数据类型&#xff0c;常见的…...

把握市场潮流,溯源一流品质:在抖in新风潮 国货品牌驶过万重山

好原料、好设计、好品质、好服务……这个2023&#xff0c;“国货”二字再度成为服饰行业的发展关键词。以消费热潮为翼&#xff0c;越来越多代表性品类、头部品牌展现出独特价值&#xff0c;迎风而上&#xff0c;在抖音电商掀起一轮轮生意风潮。 一个设问是&#xff1a;在抖音…...

【网络教程】Python如何优雅的分割URL

文章目录 URL分割方法是一种用于解析URL字符串的方法,它可以将URL分解成不同的组成部分,如协议、域名、端口、路径等。在Python中,我们可以使用urllib.parse模块中的urlsplit方法来实现URL分割。 使用方法 下面是一个简单的示例代码,演示了如何使用urlsplit方法解析URL字符…...

1998-2014年工业企业数据库和绿色专利匹配

1998-2014年工业企业数据库绿色专利匹配 1、时间&#xff1a;1998-2014年 2、样本量&#xff1a;470万 3、来源&#xff1a;工业企业数据库、国家知识产权局、WIPO 4、指标&#xff1a; 企业匹配唯一标识码、组织机构代码、企业名称、年份、法定代表人、法定代表人职务、行…...

Python基于Mirai开发的QQ机器人保姆式教程(亲测可用)

在本教程中&#xff0c;我们将使用Python和Mirai来开发一个QQ机器人&#xff0c;本文提供了三个教学视频&#xff0c;包教包会&#xff0c;本文也很贴心贴了代码和相关文件。话不多说&#xff0c;直接开始教学。 目录 一、安装配置MIrai 图片验证码报错&#xff1a; 二、机器…...

算法笔记:堆

【如无特别说明&#xff0c;皆为最小二叉堆】 1 介绍 2 特性 结构性&#xff1a;符合完全二叉树的结构有序性&#xff1a;满足父节点小于子节点&#xff08;最小化堆&#xff09;或父节点大于子节点&#xff08;最大化堆&#xff09; 3 二叉堆的存储 顺序存储 二叉堆的有序…...

vue3 判断包含某个字符

<img v-if"node.level 1 && checkIfIncludeSubStr(node.label, 人口)"src"/assets/images/icon-convention-01.png" width"16"class"inlineBlock Vmiddle" style"margin-right: 8px;"/>const data reactive…...

MySQL的故事——查询性能优化

查询性能优化 文章目录 查询性能优化一、查询优化器的提示(hint)二、优化特定类型的查询 一、查询优化器的提示(hint) HIGH_PRIORITY和LOW_PRIORITY 这个提示告诉MySQL&#xff0c;当多个语句同时访问某一个表时&#xff0c;哪些语句的优先级相对高些&#xff0c;哪些相对低些…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...