ホームページ バックエンド開発 C#.Net チュートリアル C#のSocketを利用してUDPプロトコル通信を実装するサンプルコードを詳しく解説

C#のSocketを利用してUDPプロトコル通信を実装するサンプルコードを詳しく解説

Mar 23, 2017 am 11:57 AM

この記事では主に C# ソケット実装 UDP プロトコル通信のサンプルコードを紹介しますが、編集者が非常に良いと思ったので、参考として共有させていただきます。編集者をフォローして見てみましょう

今日は、C# の Socket を使用した UDP 通信を検証し、将来の UDP を使用した分散通信シミュレーション システムの基礎を築きました。ご存知のとおり、UDP はユーザー データグラム プロトコルであり、インターネット参照モデル の 4 番目の層であるトランスポート層です。どちらも TCP プロトコルと同じ層で情報伝送サービスを提供しますが、TCP との最大の違いは、コネクションレスで信頼性の低い情報伝送であることです。

コネクションレスで信頼性が低いとは何ですか?端的に言えば、データを送信するときは、UDP パケットをネットワークに投げるだけで済みます。データを受信するときは、ローカルに送信された UDP パケットがあれば受信されます。すべてを集めて、集めた後に誰が送ったかを確認してください。 TCPと比べて、ハンドシェイクによるコネクション確立、コネクション維持、コネクション解放といった一連の処理が必要ないため、リソース消費が少なく、処理速度が速いというメリットがあります。

さて、くだらない話をたくさんしたので、UDP 通信に C# で Socket を使用する方法について話始めましょう。 TCP および UDP アプリケーションは、TCPClient、TCPListener、および UDPClient クラスを通じてプログラムできます。これらのプロトコル クラスも System.Net.Sockets.Socket クラスに基づいており、データ送信の詳細を気にする必要はありません。ただし、Socket プログラミングをより深く理解するために、UDP 通信プログラミングには Socket クラスが依然として使用されています。

UDP アプリケーションでは、厳密な意味での実際のサーバーとクライアントの区別はなくなりました。そのため、通信するためのプログラムを作成するだけで済みます。

コードの重要な部分と説明を以下に示します:

主要なグローバル変数

private IPEndPoint ipLocalPoint; 
private EndPoint RemotePoint; 
private Socket mySocket; 
private bool RunningFlag = false;
ログイン後にコピー

ローカルIPの取得方法

private string getIPAddress() 
 { 
   // 获得本机局域网IP地址 
   IPAddress[] AddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList; 
   if (AddressList.Length < 1) 
   { 
     return ""; 
   } 
   return AddressList[0].ToString(); 
 }
ログイン後にコピー

IPとポート番号の有効性の検証

private int getValidPort(string port) 
  { 
    int lport; 
    //测试端口号是否有效 
    try 
    { 
      //是否为空 
      if (port == "") 
      { 
        throw new ArgumentException( 
          "端口号无效,不能启动DUP"); 
      } 
      lport = System.Convert.ToInt32(port); 
    } 
    catch (Exception e) 
    { 
      //ArgumentException,  
      //FormatException,  
      //OverflowException 
      Console.WriteLine("无效的端口号:" + e.ToString()); 
      this.tbMsg.AppendText("无效的端口号:" + e.ToString() + "\n"); 
      return -1; 
    } 
    return lport; 
  } 
 
 
  private IPAddress getValidIP(string ip) 
  { 
    IPAddress lip = null; 
    //测试IP是否有效 
    try 
    { 
      //是否为空 
      if (!IPAddress.TryParse(ip, out lip)) 
      { 
        throw new ArgumentException( 
          "IP无效,不能启动DUP"); 
      } 
    } 
    catch (Exception e) 
    { 
      //ArgumentException,  
      //FormatException,  
      //OverflowException 
      Console.WriteLine("无效的IP:" + e.ToString()); 
      this.tbMsg.AppendText("无效的IP:" + e.ToString() + "\n"); 
      return null; 
    } 
    return lip; 
  }
ログイン後にコピー

ソケット構成

//得到本机IP,设置UDP端口号   
ip = getValidIP(tbLocalIP.Text); 
port = getValidPort(tbLocalPort.Text); 
ipLocalPoint = new IPEndPoint(ip, port); 
 
//定义网络类型,数据连接类型和网络协议UDP 
mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
 
//绑定网络地址 
mySocket.Bind(ipLocalPoint); 
 
//得到客户机IP 
ip = getValidIP(tbRemoteIP.Text); 
port = getValidPort(tbRemotePort.Text); 
IPEndPoint ipep = new IPEndPoint(ip, port); 
RemotePoint = (EndPoint)(ipep); 
 
//启动一个新的线程,执行方法this.ReceiveHandle, 
//以便在一个独立的进程中执行数据接收的操作 
 
RunningFlag = true; 
Thread thread = new Thread(new ThreadStart(this.ReceiveHandle)); 
thread.Start();
ログイン後にコピー

受信スレッド

//定义一个委托 
public delegate void MyInvoke(string strRecv); 
private void ReceiveHandle() 
{ 
  //接收数据处理线程 
  string msg; 
  byte[] data=new byte[1024]; 
  MyInvoke myI = new MyInvoke(UpdateMsgTextBox); 
  while (RunningFlag) 
  { 
     
    if (mySocket == null || mySocket.Available < 1) 
    { 
      Thread.Sleep(200); 
      continue; 
    } 
    //跨线程调用控件 
     //接收UDP数据报,引用参数RemotePoint获得源地址 
     int rlen = mySocket.ReceiveFrom(data, ref RemotePoint); 
    msg = Encoding.Default.GetString(data, 0, rlen); 
    tbMsg.BeginInvoke(myI, new object[]{RemotePoint.ToString() + " : " + msg}); 
     
  } 
} 
private void btSend_Click(object sender, EventArgs e) 
{ 
  string msg; 
  msg = tbSendMsg.Text; 
  //发送UDP数据包 
  byte[] data = Encoding.Default.GetBytes(msg); 
  mySocket.SendTo(data, data.Length, SocketFlags.None, RemotePoint); 
} 
private void UpdateMsgTextBox(string msg) 
{ 
  //接收数据显示 
  this.tbMsg.AppendText( msg + "\n"); 
}
ログイン後にコピー

上記はローカルとリモートのIPとポート番号を設定するだけで、簡単にUDP双方向通信を実現できます。 UDP データ パケットは信頼性の高い送信を保証できませんが、ネットワークの混雑や混雑、その他の要因により、データ パケットが指定された宛先に到達できない可能性があります。ただし、テストした結果、その通信は非常に信頼性が高くなります。QQ はインスタント通信にも UDP を使用していることを忘れないでください。


以上がC#のSocketを利用してUDPプロトコル通信を実装するサンプルコードを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C# を使用した Active Directory C# を使用した Active Directory Sep 03, 2024 pm 03:33 PM

C# を使用した Active Directory のガイド。ここでは、Active Directory の概要と、C# での動作方法について、構文と例とともに説明します。

C# のアクセス修飾子 C# のアクセス修飾子 Sep 03, 2024 pm 03:24 PM

C# のアクセス修飾子のガイド。 C# のアクセス修飾子の種類について、例と出力とともに説明しました。

C# の乱数ジェネレーター C# の乱数ジェネレーター Sep 03, 2024 pm 03:34 PM

C# の乱数ジェネレーターのガイド。ここでは、乱数ジェネレーターの仕組み、擬似乱数の概念、安全な数値について説明します。

C# データ グリッド ビュー C# データ グリッド ビュー Sep 03, 2024 pm 03:32 PM

C# データ グリッド ビューのガイド。ここでは、SQL データベースまたは Excel ファイルからデータ グリッド ビューをロードおよびエクスポートする方法の例について説明します。

C# 文字列リーダー C# 文字列リーダー Sep 03, 2024 pm 03:23 PM

C# StringReader のガイド。ここでは、C# StringReader の概要とその動作について、さまざまな例やコードとともに説明します。

C# のパターン C# のパターン Sep 03, 2024 pm 03:33 PM

C# のパターンのガイド。ここでは、C# のパターンの概要と上位 3 種類について、その例とコード実装とともに説明します。

C# シリアル化 C# シリアル化 Sep 03, 2024 pm 03:30 PM

C# シリアル化のガイド。ここでは、C# シリアル化オブジェクトの導入、手順、作業、例についてそれぞれ説明します。

C# の BinaryWriter C# の BinaryWriter Sep 03, 2024 pm 03:22 PM

C# の BinaryWriter のガイド。ここでは、構文と説明、適切なコードで実装するための例とそれがどのように機能するかについて説明します。

See all articles