次の方法で共有


UDP サービスを使用する

UdpClient クラスは、UDP を使用してネットワーク サービスと通信します。 UdpClient クラスのプロパティとメソッドは、UDP を使用してデータを要求および受信するためのSocketの作成の詳細を抽象化します。

ユーザー データグラム プロトコル (UDP) は、リモート ホストにデータを配信するためのベスト エフォートを行う単純なプロトコルです。 ただし、UDP プロトコルはコネクションレス プロトコルであるため、リモート エンドポイントに送信される UDP データグラムが到着する保証も、送信されるのと同じシーケンスで到着することが保証されるわけではありません。 UDP を使用するアプリケーションは、欠落しているデータグラム、重複データ、およびシーケンス外のデータグラムを処理するように準備する必要があります。

UDP を使用してデータグラムを送信するには、必要なサービスをホストしているネットワーク デバイスのネットワーク アドレスと、サービスが通信に使用する UDP ポート番号を知っている必要があります。 インターネット割り当て番号機関 (IANA) は、共通サービスのポート番号を定義します ( サービス名とトランスポート プロトコルのポート番号レジストリを参照)。 IANA リストにないサービスは、1,024 ~ 65,535 の範囲のポート番号を持つことができます。

特殊なネットワーク アドレスは、IP ベースのネットワーク上の UDP ブロードキャスト メッセージをサポートするために使用されます。 次の説明では、インターネットで使用される IP バージョン 4 アドレス ファミリを例として使用します。

IP バージョン 4 のアドレスでは、32 ビットを使用してネットワーク アドレスを指定します。 255.255.255.0 のネットマスクを使用するクラス C アドレスの場合、これらのビットは 4 オクテットに分割されます。 10 進数で表すと、4 オクテットは、192.168.100.2 などの使い慣れたドット四角形表記を形成します。 最初の 2 オクテット (この例では 192.168) はネットワーク番号を形成し、3 番目のオクテット (100) はサブネットを定義し、最後のオクテット (2) はホスト識別子です。

IP アドレスのすべてのビットを 1 つ (255.255.255.255) に設定すると、制限付きブロードキャスト アドレスが形成されます。 このアドレスに UDP データグラムを送信すると、ローカル ネットワーク セグメント上の任意のホストにメッセージが配信されます。 ルーターはこのアドレスに送信されたメッセージを転送しないため、ネットワーク セグメント上のホストのみがブロードキャスト メッセージを受信します。

ブロードキャストは、ホスト識別子のすべてのビットを設定することで、ネットワークの特定の部分に送信できます。 たとえば、192.168.1 以降の IP アドレスで識別されるネットワーク上のすべてのホストにブロードキャストを送信するには、アドレス 192.168.1.255 を使用します。

次のコード例では、 UdpClient を使用して、ポート 11,000 で UDP データグラムをリッスンします。 クライアントはメッセージ文字列を受け取り、コンソールにメッセージを書き込みます。

Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class UDPListener
   Private Const listenPort As Integer = 11000

   Private Shared Sub StartListener()
      Dim listener As New UdpClient(listenPort)
      Dim groupEP As New IPEndPoint(IPAddress.Any, listenPort)
      Try
         While True
            Console.WriteLine("Waiting for broadcast")
            Dim bytes As Byte() = listener.Receive(groupEP)
            Console.WriteLine("Received broadcast from {0} :", groupEP)
            Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytes.Length))
         End While
      Catch e As SocketException
         Console.WriteLine(e)
      Finally
         listener.Close()
      End Try
   End Sub 'StartListener

   Public Shared Sub Main()
      StartListener()
   End Sub 'Main
End Class 'UDPListener
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class UDPListener
{
    private const int listenPort = 11000;

    private static void StartListener()
    {
        UdpClient listener = new UdpClient(listenPort);
        IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);

        try
        {
            while (true)
            {
                Console.WriteLine("Waiting for broadcast");
                byte[] bytes = listener.Receive(ref groupEP);

                Console.WriteLine($"Received broadcast from {groupEP} :");
                Console.WriteLine($" {Encoding.ASCII.GetString(bytes, 0, bytes.Length)}");
            }
        }
        catch (SocketException e)
        {
            Console.WriteLine(e);
        }
        finally
        {
            listener.Close();
        }
    }

    public static void Main()
    {
        StartListener();
    }
}

次のコード例では、 Socket を使用して、ポート 11,000 を使用して、ダイレクト ブロードキャスト アドレス 192.168.1.255 に UDP データグラムを送信します。 クライアントは、コマンド ラインで指定されたメッセージ文字列を送信します。

Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class Program
    Public Shared Sub Main(args() As [String])
      Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
      s.EnableBroadcast = True
      Dim broadcast As IPAddress = IPAddress.Parse("192.168.1.255")
      Dim sendbuf As Byte() = Encoding.ASCII.GetBytes(args(0))
      Dim ep As New IPEndPoint(broadcast, 11000)
      s.SendTo(sendbuf, ep)
      Console.WriteLine("Message sent to the broadcast address")
   End Sub 'Main
End Class
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        s.EnableBroadcast = true;

        IPAddress broadcast = IPAddress.Parse("192.168.1.255");

        byte[] sendbuf = Encoding.ASCII.GetBytes(args[0]);
        IPEndPoint ep = new IPEndPoint(broadcast, 11000);

        s.SendTo(sendbuf, ep);

        Console.WriteLine("Message sent to the broadcast address");
    }
}

こちらも参照ください