c#udp协议详解

一、UDP协议概述

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的协议,数据报文的大小在IP协议层被限制为65,507字节。UDP不保证数据的可靠传输,没有重传机制,而且无序且不重复,比TCP更加轻量级,通常用于实时的应用场景,如游戏,视频等。

二、c#udp实现

1、发送数据

c#中使用UdpClient实现UDP协议的发送数据,示例代码如下:

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

class SendData
{
    static void Main(string[] args)
    {
        //定义IP和端口
        string ip = "127.0.0.1";
        int port = 8888;
        //定义发送的数据
        string message = "Hello World!";
        byte[] sendBytes = Encoding.ASCII.GetBytes(message);
        
        //定义UDP客户端
        UdpClient client = new UdpClient();
        //发送数据
        client.Send(sendBytes, sendBytes.Length, ip, port);
        //关闭UDP客户端
        client.Close();
    }
}

2、接收数据

c#中使用UdpClient实现UDP协议的接收数据,示例代码如下:

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

class ReceiveData
{
    static void Main(string[] args)
    {
        //定义IP和端口
        string ip = "127.0.0.1";
        int port = 8888;
        //定义UDP客户端
        UdpClient client = new UdpClient(port);
        //定义接收数据的IP和端口
        IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Parse(ip), port);

        while (true)
        {
            //接收数据
            byte[] receiveBytes = client.Receive(ref remoteIpep);
            string message = Encoding.ASCII.GetString(receiveBytes, 0, receiveBytes.Length);
            Console.WriteLine("接收到的数据为:" + message);
        }
        
        //关闭UDP客户端
        client.Close();
    }
}

三、小标题

1、c#udp实现视频传输

UDP适用于实时的应用,如实时视频传输。c#可以结合FFmpeg库实现视频的采集和传输,示例代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FFmpeg.AutoGen;
using System.Runtime.InteropServices;
using System.Net.Sockets;
using System.Threading;
using System.Net;

namespace UdpVideoStreaming
{
    class Program
    {
        static void Main(string[] args)
        {
            int videoStreamIndex = -1;

            //初始化FFmpeg
            ffmpeg.av_register_all();
            ffmpeg.avcodec_register_all();
            ffmpeg.avformat_network_init();

            //打开视频
            AVFormatContext* pFormatContext = null;
            if (ffmpeg.avformat_open_input(&pFormatContext, "test.mp4", null, null) != 0)
            {
                Console.WriteLine("无法打开视频文件");
                return;
            }

            //查找视频流
            if (ffmpeg.avformat_find_stream_info(pFormatContext, null) < 0)
            {
                Console.WriteLine("无法查找视频流");
                return;
            }

            Codecs.CodecContext videoCodecContext = new Codecs.CodecContext();
            videoStreamIndex = ffmpeg.av_find_best_stream(pFormatContext, AVMediaType.AVMEDIA_TYPE_VIDEO, -1, -1,videoCodecContext.Codec, 0);
            if (videoStreamIndex == -1)
            {
                Console.WriteLine("无法找到视频流");
                return;
            }

            //打开视频解码器
            if (ffmpeg.avcodec_open2(videoCodecContext, videoCodecContext.Codec, null) = 0)
            {
                if (pPacket->stream_index == videoStreamIndex)
                {
                    //发送视频数据
                    int length = 0;
                    byte[] data = new byte[pPacket->size];
                    Marshal.Copy(new IntPtr(pPacket->data), data, 0, pPacket->size);

                    client.Send(data, data.Length, remoteIpep);

                    //延时
                    Thread.Sleep(40);
                }

                ffmpeg.av_packet_unref(pPacket);
            }

            ffmpeg.av_packet_free(&pPacket);

            ffmpeg.avcodec_close(videoCodecContext);
            ffmpeg.avformat_close_input(&pFormatContext);
        }
    }
}

2、c#udp实现多人游戏

UDP适用于实时的应用,如多人网络游戏。c#可以使用Unity引擎结合UDP协议实现多人游戏,示例代码如下:

using UnityEngine;
using System.Collections;
using System.Net.Sockets;
using System.Net;
using System.Threading;

public class UdpController : MonoBehaviour
{
    private UdpClient udpClient;
    private Thread receiveThread;

    private void Start()
    {
        //定义接收数据的IP和端口
        IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Any, 8888);
        //定义UDP客户端
        udpClient = new UdpClient(remoteIpep);
        //开启接收数据的线程
        receiveThread = new Thread(new ThreadStart(ReceiveData));
        receiveThread.Start();
    }

    private void OnApplicationQuit()
    {
        receiveThread.Abort();
        udpClient.Close();
    }

    private void ReceiveData()
    {
        while (true)
        {
            byte[] receiveBytes = udpClient.Receive(ref remoteIpep);
            string message = Encoding.ASCII.GetString(receiveBytes, 0, receiveBytes.Length);
            Debug.Log("接收到的数据为:" + message);
        }
    }

    private void SendData()
    {
        //定义发送的数据
        string message = "Hello World!";
        byte[] sendBytes = Encoding.ASCII.GetBytes(message);
        //定义发送的IP和端口
        IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888);
        //发送数据
        udpClient.Send(sendBytes, sendBytes.Length, remoteIpep);
    }
}

3、c#udp与TCP的区别

TCP为面向连接的协议,具有可靠性高的特点,可以保证数据的可靠传输。而UDP为无连接的协议,不保证数据的可靠传输,但是更轻量级。在网络游戏,实时视频传输等实时应用场景中,使用UDP能够保证更好的实时性。

原创文章,作者:NAMYB,如若转载,请注明出处:https://www.506064.com/n/329188.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
NAMYBNAMYB
上一篇 2025-01-14 18:55
下一篇 2025-01-14 18:55

相关推荐

  • ENet UDP 用法介绍

    ENet 是用于实现可靠的 UDP 网络通信库。它可以在保证网络可靠性的前提下,提高网络通信的速度,是游戏开发和实时数据传输领域中常用的网络库之一。本文将围绕 ENet UDP 进…

    编程 2025-04-29
  • 机智云gagent属于哪个协议?

    机智云gagent主要是基于MQTT协议,同时支持TCP、TLS、WebSocket等多种协议。 一、MQTT协议介绍 MQTT全称Message Queuing Telemetr…

    编程 2025-04-29
  • 使用Netzob进行网络协议分析

    Netzob是一款开源的网络协议分析工具。它提供了一套完整的协议分析框架,可以支持多种数据格式的解析和可视化,方便用户对协议数据进行分析和定制。本文将从多个方面对Netzob进行详…

    编程 2025-04-29
  • 如何取消火车票自动抢票协议

    火车票自动抢票协议,是一种利用技术手段在系统繁忙的情况下,自动刷取并抢购火车票的行为。虽然在某些情况下能够提高购票成功率,但是也会影响其他乘客的购票权益。因此,取消火车票自动抢票协…

    编程 2025-04-29
  • USB协议栈

    USB(Universal Serial Bus)是一种常见的计算机外部接口,它已经被广泛使用在各种设备中,例如打印机、键盘、鼠标等。在实现USB通信的过程中,USB协议栈起着非常…

    编程 2025-04-27
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25

发表回复

登录后才能评论