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

4 篇文章 0 订阅
1 篇文章 0 订阅

服务端


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才可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Centos7发布说明 环境说明: 服务器系统:CentOS 7.2.1511 相关工具:Xshel、Xftp 服务器软件软件:.netcore、nginx、supervisor 准备好发布的程序 安装.NET Core SDK for CentOS7 打开网址:https://www.microsoft.com/net/core#linuxcentos 复制如下命令,单步执行: sudo yum install libunwind libicu curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=835019 sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet sudo ln -s /opt/dotnet/dotnet /usr/local/bin 输入 dotnet –info 来查看是否安装成功 配置Nginx 下载安装Nginx,单步执行如下命令: curl -o nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm rpm -ivh nginx.rpm yum install nginx systemctl start nginx 来启动nginx systemctl enable nginx 来设置nginx的开机启动(linux宕机、重启会自动运行nginx不需要连上去输入命令)。 配置防火墙 命令:firewall-cmd --zone=public --add-port=80/tcp --permanent(开放80端口) 命令:systemctl restart firewalld(重启防火墙以使配置即时生效) 测试nginx是否可以访问。 配置nginx对ASP.NET Core应用的转发 修改 /etc/nginx/conf.d/default.conf 文件,将文件内容替换为: server { listen 80; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值