C# 网络编程之UDP

C# 网络编程之UDP

什么是UDP

UDP是一个无连接的传输协议,它不保证可靠传输和数据的顺序,但是其传输速度很快,适合于传输实时性要求高的数据。

UDP的使用场景

由于UDP不需要建立连接,所以适合于一对多或多对多的广播传输。比如实现网络游戏的消息传输,实时视频传输等。

UDP编程实现

发送端实现

UDP发送方需要绑定发送端口,然后指定目标地址和目标端口,将要发送的数据包发送出去。

示例1:发送一个简单的字符串。

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

class Sender {
  static void Main() {
    var endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);
    using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
      byte[] data = Encoding.UTF8.GetBytes("Hello World!");
      socket.SendTo(data, endPoint);
    }
  }
}

示例2:发送一个自定义的数据包。

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

struct CustomPacket {
  public int id;
  public float x;
  public float y;
  public float z;
}

class Sender {
  static void Main() {
    var endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);
    using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
      var packet = new CustomPacket {
        id = 123,
        x = 1.0f,
        y = 2.0f,
        z = 3.0f
      };
      byte[] data = Serialize(packet);
      socket.SendTo(data, endPoint);
    }
  }

  // 自定义的序列化方法
  static byte[] Serialize<T>(T obj) {
    int size = System.Runtime.InteropServices.Marshal.SizeOf(typeof(T));
    byte[] data = new byte[size];
    var ptr = System.Runtime.InteropServices.Marshal.AllocHGlobal(size);
    System.Runtime.InteropServices.Marshal.StructureToPtr(obj, ptr, true);
    System.Runtime.InteropServices.Marshal.Copy(ptr, data, 0, size);
    System.Runtime.InteropServices.Marshal.FreeHGlobal(ptr);
    return data;
  }
}

接收端实现

UDP接收方需要绑定监听端口,然后不断从网络中读取数据包。

示例1:接收简单的字符串。

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

class Receiver {
  static void Main() {
    var endPoint = new IPEndPoint(IPAddress.Any, 12345);
    using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
      socket.Bind(endPoint);
      byte[] buffer = new byte[1024];
      int size = socket.Receive(buffer);
      string message = Encoding.UTF8.GetString(buffer, 0, size);
      Console.WriteLine(message);
    }
  }
}

示例2:接收自定义的数据包。

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

struct CustomPacket {
  public int id;
  public float x;
  public float y;
  public float z;
}

class Receiver {
  static void Main() {
    var endPoint = new IPEndPoint(IPAddress.Any, 12345);
    using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
      socket.Bind(endPoint);
      byte[] buffer = new byte[1024];
      int size = socket.Receive(buffer);
      var packet = Deserialize<CustomPacket>(buffer, size);
      Console.WriteLine(packet.id);
      Console.WriteLine(packet.x);
      Console.WriteLine(packet.y);
      Console.WriteLine(packet.z);
    }
  }

  // 自定义的反序列化方法
  static T Deserialize<T>(byte[] buffer, int size) {
    T obj = default(T);
    int objSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(T));
    if (size == objSize) {
      var ptr = System.Runtime.InteropServices.Marshal.AllocHGlobal(objSize);
      System.Runtime.InteropServices.Marshal.Copy(buffer, 0, ptr, objSize);
      obj = (T)System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeof(T));
      System.Runtime.InteropServices.Marshal.FreeHGlobal(ptr);
    }
    return obj;
  }
}

UDP总结

UDP是一个高速传输的无连接协议,适合于实时性要求高的数据传输。使用UDP需要我们手动处理数据包的组装和拆解,同时对于丢包和乱序等问题需要自行处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 网络编程之UDP - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • ASP.net Substitution 页面缓存而部分不缓存的实现方法

    ASP.NET Substitution 页面缓存是指在对于某些页面的内容经常变化的情况下,我们可以启用页面缓存,但仍然让部分内容保持实时刷新的功能。本篇攻略将会为大家介绍如何实现此功能。 使用 Substitution 控件 我们可以使用 Substitution 控件的方式来实现 ASP.NET Substitution 页面缓存而部分不缓存的功能,具体…

    C# 2023年6月3日
    00
  • C#文件下载实例代码(适用于各个浏览器)

    下面是针对C#文件下载实例代码(适用于各个浏览器)的完整攻略。 什么是C#文件下载实例代码? C#文件下载实例代码就是利用C#编程语言实现的文件下载功能的示例代码。对于网站开发人员来说,文件下载功能是非常重要的一部分,可以提高用户体验和网站的服务能力。 如何实现C#文件下载功能 C#实现文件下载的基本过程包括以下几个步骤: 创建Web请求对象(WebRequ…

    C# 2023年5月31日
    00
  • c#调用c++方法介绍,window api

    C#调用C++方法介绍 简介 C#是一种高级编程语言,而C++是一种中级编程语言,在底层处理方面有着突出的优势。将C++模块集成到C#应用程序中,可以利用C++的性能和底层优势来完成一些高性能任务。在实际应用中,使用C#调用C++模块的场景非常普遍,例如Windows API和某些组件库都是基于C++编写的,但是由于其底层特性和页面优化等方面,利用C#调用C…

    C# 2023年6月7日
    00
  • 正确使用dotnet-*工具的方法

    使用 dotnet- 工具是在 .NET Core 中执行各种任务的一种方便的方法。这些工具包括 dotnet build、dotnet run、dotnet test 等。以下是正确使用 dotnet- 工具的完整攻略: 步骤一:安装 .NET Core SDK 首先,需要安装 .NET Core SDK。可以从 Microsoft 的官方网站下载并安装 …

    C# 2023年5月17日
    00
  • C# wx获取token的基本方法

    C# wx获取token的基本方法 什么是Token? 在微信公众号开发中,Token是指在微信公众平台上,通过接口调用获取到的一个用于对当前公众号进行身份验证的字符串。 获取Token的基本方法 获取Token的基本方法是向微信服务器发送HTTP请求。发送请求的URL是: https://api.weixin.qq.com/cgi-bin/token?gr…

    C# 2023年5月31日
    00
  • C# String.Split()方法: 按指定的分隔符将字符串分成一个字符串数组

    String.Split()方法是C#中用于将字符串按照指定的字符或字符串分割成子字符串的方法。具体来说,Split()方法会根据指定的分隔符将原字符串分割成多个子字符串,并返回一个字符串类型的数组,数组中的每个元素都是一个分割后的子字符串。 Split()方法有多种重载形式,下面分别介绍常用的两个重载形式。 1. Split(char[] separato…

    C# 2023年4月19日
    00
  • C#影院售票系统毕业设计(1)

    下面逐步讲解“C#影院售票系统毕业设计(1)”的完整攻略。 1. 确定项目需求 要开发一个影院售票系统,需要满足以下需求: 用户端 用户可以通过图形化操作,实现选座、支付等功能; 可以查看影片排片信息、影院信息、个人信息等; 可以对已完成订单进行评价和投诉; 实现基本的安全性,如密码保护等。 管理员端 管理员可以通过图形化界面添加、修改、删除影片和影院信息;…

    C# 2023年6月1日
    00
  • 详解Unity使用ParticleSystem粒子系统模拟药水在血管中流动(粒子碰撞)

    详解Unity使用ParticleSystem粒子系统模拟药水在血管中流动(粒子碰撞) 简介 ParticleSystem是Unity中用于创建、模拟粒子系统的组件。在游戏中,我们可以使用ParticleSystem模拟火、烟、雨、雪等特效。本文将介绍如何利用ParticleSystem模拟药水在血管中流动,以及如何实现粒子碰撞。 创建药水流动的效果 首先,…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部