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/zh-tw/n/329188.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
NAMYB的頭像NAMYB
上一篇 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

發表回復

登錄後才能評論