UDP サービスの使用
UdpClient クラスは、UDP を使用してネットワーク サービスと通信します。UdpClient クラスのプロパティやメソッドを使用すると、UDP を使用してデータを要求および受信するための Socket の作成について詳細を考慮する必要がなくなります。
ユーザー データグラム プロトコル (UDP : User Datagram Protocol) は、データをリモート ホストに送信するのに役立つシンプルなプロトコルです。しかし、UDP プロトコルはコネクションレス プロトコルであるため、リモートのエンドポイントに送信される UDP データグラムは送信先に着信する保証がなく、着信した場合でも、送信時と同じ順序で着信するかどうかは保証されません。UDP を使用するアプリケーションは、データグラムが欠損した場合や、重複している場合、および順序が乱れている場合に対処できるようにしておく必要があります。
UDP を使用してデータグラムを送信するには、必要なサービスをホストするネットワーク デバイスのネットワーク アドレスと、そのサービスが通信に使用する UDP ポート番号を把握しておく必要があります。一般的なサービスが使用するポート番号は IANA (Internet Assigned Numbers Authority) が定義しています。http://www.iana.org/assignments/port-numbers (英語情報) を参照してください。IANA の一覧に記載されていないサービスは、1,024 ~ 65,535 の範囲のポート番号を使用できます。
IP ベースのネットワークで UDP ブロードキャスト メッセージをサポートするためには、専用のネットワーク アドレスが使用されます。以下の説明では、インターネットで使用されている IP バージョン 4 アドレス ファミリを例として使用します。
IP バージョン 4 のアドレスは、32 ビットでネットワーク アドレスを指定します。ネットマスクとして 255.255.255.0 を使用しているクラス C アドレスでは、これらのビットは 4 つのオクテットに分割されます。これらの 4 つのオクテットを 10 進数で表現すると、192.168.100.2 のように、ピリオドで 4 つの部分に区切られた一般的な表記になります。最初の 2 つのオクテット (この例では 192.168) はネットワーク番号を表し、3 番目のオクテット (100) はサブネットを定義し、最後のオクテット (2) はホスト識別子を表します。
IP アドレスのすべてのビットを 1 に設定すると (255.255.255.255)、制限されたブロードキャスト アドレスになります。UDP データグラムをこのアドレスに送信すると、そのメッセージはローカル ネットワーク セグメント上のすべてのホストに送られます。ルーターは、このアドレス宛てのメッセージを転送しないため、ネットワーク セグメント上のホストだけが、ブロードキャスト メッセージを受信することになります。
ホスト識別子のすべてのビットを設定すると、ネットワークの特定の部分にブロードキャストを送信できます。たとえば、192.168.1 で始まる IP アドレスで識別されるネットワーク上のすべてのホストにブロードキャストを送信するには、192.168.1.255 というアドレスを使用します。
UdpClient を使用して、ダイレクト ブロードキャスト アドレス 192.168.1.255 に送信されるデータグラムをポート 11,000 上でリッスンするコード例を次に示します。クライアントは、メッセージ文字列を受信して、そのメッセージをコンソールに書き込みます。
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class UDPListener
Private Const listenPort As Integer = 11000
Private Shared Sub StartListener()
Dim done As Boolean = False
Dim listener As New UdpClient(listenPort)
Dim groupEP As New IPEndPoint(IPAddress.Any, listenPort)
Try
While Not done
Console.WriteLine("Waiting for broadcast")
Dim bytes As Byte() = listener.Receive(groupEP)
Console.WriteLine("Received broadcast from {0} :", _
groupEP.ToString())
Console.WriteLine( _
Encoding.ASCII.GetString(bytes, 0, bytes.Length))
Console.WriteLine()
End While
Catch e As Exception
Console.WriteLine(e.ToString())
Finally
listener.Close()
End Try
End Sub 'StartListener
Public Shared Function Main() As Integer
StartListener()
Return 0
End Function '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()
{
bool done = false;
UdpClient listener = new UdpClient(listenPort);
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any,listenPort);
try
{
while (!done)
{
Console.WriteLine("Waiting for broadcast");
byte[] bytes = listener.Receive( ref groupEP);
Console.WriteLine("Received broadcast from {0} :\n {1}\n",
groupEP.ToString(),
Encoding.ASCII.GetString(bytes,0,bytes.Length));
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
listener.Close();
}
}
public static int Main()
{
StartListener();
return 0;
}
}
UdpClient を使用して、ポート 11,000 を経由してダイレクト ブロードキャスト アドレス 192.168.1.255 に UDP データグラムを送信するコード例を次に示します。クライアントは、コマンド ラインで指定したメッセージ文字列を送信します。
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class Program
Overloads Public Shared Function Main(args() As [String]) As Integer
Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp)
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 Function '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);
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");
}
}