C# 网络编程之UDP

yizhihongxing

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日

相关文章

  • C#验证用户输入信息是否包含危险字符串的方法

    当用户提交输入信息时,应该进行对输入信息进行过滤,排除包含有恶意的、危险的字符串,避免安全问题的发生。本文将详细讲解 C# 验证用户输入信息是否包含危险字符串的方法。 步骤1:安装 Microsoft.Security.Application 库 Microsoft.Security.Application 是一个 .Net FrameWork 库,提供了一…

    C# 2023年5月15日
    00
  • SQL Server存储过程在C#中调用的简单实现方法

    下面我将详细讲解SQL Server存储过程在C#中调用的简单实现方法。 简介 存储过程是在SQL Server中执行SQL语句的一种重要方式,它可以提高数据库的性能,减少重复的代码量,还可以提高数据库的安全性。通过C#语言来调用SQL Server存储过程,可以更加方便地完成数据库操作。 第一步:创建SQL Server存储过程 创建SQL Server存…

    C# 2023年5月31日
    00
  • MASAMinimalAPI:创建MinimalAPI项目

    项目准备 1.创建项目,选择webapi。取消勾选使用控制器。创建minimal Api项目 2.创建成功后MinimalAPI的接口直接写在program.cs中 3.引入nuget包:Masa.Contrib.Service.MinimalAPIs MinimalAPI改造 1. 在program.cs中加入以下内容 将原有的 var app = bui…

    C# 2023年5月5日
    00
  • 基于C#实现端口扫描器(单线程和多线程)

    基于C#实现端口扫描器(单线程和多线程) 端口扫描器是渗透测试和网络安全领域中一个非常重要的工具,它用于发现网络主机上开放的TCP/UDP端口。本文将基于C#实现一个简单的端口扫描器并探讨如何使用单线程和多线程技术来提高效率。 端口扫描器实现流程 解析待扫描主机的IP地址和端口范围 循环遍历端口范围,尝试向目标主机的每个端口发送TCP或UDP连接请求 根据返…

    C# 2023年5月15日
    00
  • C#聊天程序服务端与客户端完整实例代码

    下面我将为您详细讲解“C#聊天程序服务端与客户端完整实例代码”的完整攻略。 关于“C#聊天程序服务端与客户端完整实例代码” 这是一篇介绍如何使用C#语言实现聊天程序的完整攻略。其中包括服务端和客户端的完整代码。 服务端使用C#语言实现,使用TCP协议进行通信。并且,服务端为多线程模型,能够同时处理多个客户端连接请求。 客户端使用C#语言实现,可以与服务端建立…

    C# 2023年6月7日
    00
  • c# 实现康威生命游戏(细胞自动机)的示例

    下面是“C#实现康威生命游戏(细胞自动机)的示例”的完整攻略。 什么是康威生命游戏? 康威生命游戏,也叫细胞自动机,是由英国数学家康威在1970年创造的一款零玩家游戏。它是基于规则的数学模型,通过简单的规则模拟生命的演化。 康威生命游戏的细胞由像素矩阵组成,每个细胞只有两种状态:存活或死亡。它们按照一定的规律演化,并产生出各种各样的图案,如静态的花式、循环的…

    C# 2023年5月15日
    00
  • C#中comboBox实现三级联动

    下面我来详细讲解C#中如何使用comboBox实现三级联动。 实现思路 三级联动是指在页面中有三级选项,当第一级选项发生变化时,第二级选项和第三级选项的内容会随之改变。在C#中,我们可以利用comboBox控件的SelectedIndexChanged事件和Add方法来实现三级联动。 首先,在设计表单时,我们需要创建三个comboBox控件,分别用来显示三级…

    C# 2023年6月1日
    00
  • C# Console类的具体用法

    C# Console类是用于在控制台中进行输入和输出操作的类。它提供了方便易用的方法来进行控制台输入输出,是C#语言中常用的一个类,下面我们来具体讲解其用法。 Console类简介 在C#中,Console类是System命名空间的一个静态类,它提供了在控制台应用程序中读取和写入控制台输入和输出的方法。其中最常用的方法有以下几种: Console.Write…

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