UdpClient をマルチキャスト グループに追加します。
Overloads Public Sub JoinMulticastGroup( _
ByVal multicastAddr As IPAddress _)
[C#]
public void JoinMulticastGroup(IPAddressmulticastAddr);
[C++]
public: void JoinMulticastGroup(IPAddress* multicastAddr);
[JScript]
public function JoinMulticastGroup(
multicastAddr : IPAddress);
パラメータ
- multicastAddr
参加対象のグループのマルチキャスト IPAddress 。
例外
例外の種類 | 条件 |
---|---|
ObjectDisposedException | 基になる Socket は閉じられています。 |
SocketException | ソケットへのアクセス中にエラーが発生しました。詳細については、「解説」を参照してください。 |
ArgumentException | この IP アドレスは、ソケットのアドレッシング スキームを定義する AddressFamily 値と互換性がありません。 |
解説
JoinMulticastGroup メソッドは、指定した IPAddress を使用して、 UdpClient がマルチキャスト グループをサブスクライブするようにします。 JoinMulticastGroup メソッドの呼び出し後、基になる Socket がインターネット グループ管理プロトコル (IGMP) パケットをルータに送信し、マルチキャスト グループのメンバシップを要求します。マルチキャスト アドレスの範囲は 224.0.0.0 ~ 239.255.255.255 です。この範囲外のアドレスを指定した場合、または要求先のルータでマルチキャストが有効になっていない場合、 UdpClient は SocketException をスローします。 SocketException が発生した場合は、 SocketException.ErrorCode を使用して具体的なエラー コードを取得してください。このコードを取得したら、Windows Socket Version 2 API エラー コードのマニュアルから、エラーの詳細情報を確認できます。これは MSDN から入手できます。ルータによってマルチキャスト グループのメンバとして示された UdpClient は、指定した IPAddress に送信されたマルチキャスト データグラムを受信できます。
メモ UdpClient は、マルチキャスト ポート番号を使用して作成する必要があります。この番号を使用しないと、マルチキャスト データグラムを受信できません。 JoinMulticastGroup メソッドの前に Connect メソッドを呼び出さないでください。 Receive メソッドが動作しなくなります。マルチキャスト IP アドレスには、マルチキャスト グループに所属していなくてもデータグラムを送信できます。
マルチキャスト グループに参加する前に、ソケットがポートまたはエンドポイントにバインドされていることを確認してください。ポートまたはエンドポイントをパラメータとして受け取るコンストラクタの 1 つを呼び出すと、これを確認できます。
マルチキャスト データグラムの受信を停止するには、 DropMulticastGroup メソッドを呼び出して、削除元グループの IPAddress を指定します。
メモ IPv6 の場合は、複数のマルチキャスト アドレス範囲から選択できます。IETF RFC 2375 を参照してください。
使用例
[Visual Basic, C#, C++] マルチキャスト アドレスを提供することによりマルチキャスト グループに参加する方法を次の例に示します。
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Imports System.Threading
Imports Microsoft.VisualBasic
' The following Receive class is used by both the ClientOriginator and
' the ClientTarget class to receive data from one another..
Public Class Receive
' The following static method performs the actual data
' exchange. In particular, it performs the following tasks:
' 1)Establishes a communication endpoint.
' 2)Receive data through this end point on behalf of the
' caller.
' 3) Returns the received data in ASCII format.
Public Shared Function ReceiveUntilStop(c As UdpClient) As String
Dim strData As [String] = ""
Dim Ret As [String] = ""
Dim ASCII As New ASCIIEncoding()
' Establish the communication endpoint.
Dim endpoint As New IPEndPoint(IPAddress.IPv6Any, 50)
While Not strData.Equals("Over")
Dim data As [Byte]() = c.Receive(endpoint)
strData = ASCII.GetString(data)
Ret += strData + ControlChars.Lf
End While
Return Ret
End Function 'ReceiveUntilStop
End Class 'Receive
' The following Send class is used by both the ClientOriginator and
' ClientTarget classes to send data to one another.
Public Class Send
Private Shared greetings As Char() = {"H"c, "e"c, "l"c, "l"c, "o"c, " "c, "T"c, "a"c, "r"c, "g"c, "e"c, "t"c, "."c}
Private Shared nice As Char() = {"H"c, "a"c, "v"c, "e"c, " "c, "a"c, " "c, "n"c, "i"c, "c"c, "e"c, " "c, "d"c, "a"c, "y"c, "."c}
Private Shared eom As Char() = {"O"c, "v"c, "e"c, "r"c}
Private Shared tGreetings As Char() = {"H"c, "e"c, "l"c, "l"c, "o"c, " "c, "O"c, "r"c, "i"c, "g"c, "i"c, "n"c, "a"c, "t"c, "o"c, "r"c, "!"c}
Private Shared tNice As Char() = {"Y"c, "o"c, "u"c, " "c, "t"c, "o"c, "o"c, "."c}
' The following static method sends data to the ClientTarget on
' behalf of the ClientOriginator.
Public Shared Sub OriginatorSendData(c As UdpClient, ep As IPEndPoint)
Console.WriteLine(New String(greetings))
c.Send(GetByteArray(greetings), greetings.Length, ep)
Thread.Sleep(1000)
Console.WriteLine(New [String](nice))
c.Send(GetByteArray(nice), nice.Length, ep)
Thread.Sleep(1000)
Console.WriteLine(New [String](eom))
c.Send(GetByteArray(eom), eom.Length, ep)
End Sub 'OriginatorSendData
' The following static method sends data to the ClientOriginator on
' behalf of the ClientTarget.
Public Shared Sub TargetSendData(c As UdpClient, ep As IPEndPoint)
Console.WriteLine(New String(tGreetings))
c.Send(GetByteArray(tGreetings), tGreetings.Length, ep)
Thread.Sleep(1000)
Console.WriteLine(New [String](tNice))
c.Send(GetByteArray(tNice), tNice.Length, ep)
Thread.Sleep(1000)
Console.WriteLine(New [String](eom))
c.Send(GetByteArray(eom), eom.Length, ep)
End Sub 'TargetSendData
' Internal utility
Public Shared Function GetByteArray(ChArray() As [Char]) As [Byte]()
Dim Ret(ChArray.Length) As [Byte]
Dim i As Integer
For i = 0 To ChArray.Length - 1
Ret(i) = AscW(ChArray(i))
Next i
Return Ret
End Function 'GetByteArray
End Class 'Send
' The ClientTarget class is the receiver of the ClientOriginator
' messages. The StartMulticastConversation method contains the
' logic for exchanging data between the ClientTarget and its
' counterpart ClientOriginator in a multicast operation.
Public Class ClientTarget
Private Shared m_ClientTarget As UdpClient
Private Shared m_GrpAddr As IPAddress
' The following StartMulticastConversation method connects the UDP
' ClientTarget with the ClientOriginator.
' It performs the following main tasks:
' 1)Creates a UDP client to receive data on a specific port and using
' IPv6 addresses. The port is the same one used by the ClientOriginator
' to define its communication endpoint.
' 2)Joins or creates a multicast group at the specified address.
' 3)Defines the endpoint port to send data to the ClientOriginator.
' 4)Receives data from the ClientOriginator until the end of the
' communication.
' 5)Sends data to the ClientOriginator.
' Note this method is the counterpart of the
' ClientOriginator.ConnectOriginatorAndTarget().
Public Shared Sub StartMulticastConversation()
Dim Ret As String
' Bind and listen on port 1000. Specify the IPv6 address family type.
m_ClientTarget = New UdpClient(1000, AddressFamily.InterNetworkV6)
' Join or create a multicast group
m_GrpAddr = IPAddress.Parse("FF01::1")
' Use the overloaded JoinMulticastGroup method.
' Refer to the ClientOriginator method to see how to use the other
' methods.
m_ClientTarget.JoinMulticastGroup(m_GrpAddr)
' Define the endpoint data port. Note that this port number
' must match the ClientOriginator UDP port number which is the
' port on which the ClientOriginator is receiving data.
Dim ClientOriginatordest As New IPEndPoint(m_GrpAddr, 2000)
' Receive data from the ClientOriginator.
Ret = Receive.ReceiveUntilStop(m_ClientTarget)
Console.WriteLine((ControlChars.Lf + "The ClientTarget received: " + ControlChars.Lf + ControlChars.Lf + Ret + ControlChars.Lf))
' Done receiving, now respond to the ClientOriginator.
' Wait to make sure the ClientOriginator is ready to receive.
Thread.Sleep(2000)
Console.WriteLine(ControlChars.Lf + "The ClientTarget sent:" + ControlChars.Lf)
Send.TargetSendData(m_ClientTarget, ClientOriginatordest)
' Exit the multicast conversation.
m_ClientTarget.DropMulticastGroup(m_GrpAddr)
End Sub 'StartMulticastConversation
End Class 'ClientTarget
' The following ClientOriginator class starts the multicast conversation
' with the ClientTarget class..
' It performs the following main tasks:
' 1)Creates a socket and binds it to the port on which to communicate.
' 2)Specifies that the connection must use an IPv6 address.
' 3)Joins or create a multicast group.
' Note that the multicast address ranges to use are specified
' in the RFC#2375.
' 4)Defines the endpoint to send the data to and starts the
' client target (ClientTarget) thread.
Public Class ClientOriginator
Private Shared clientOriginator As UdpClient
Private Shared m_GrpAddr As IPAddress
Private Shared m_ClientTargetdest As IPEndPoint
Private Shared m_t As Thread
' The ConnectOriginatorAndTarget method connects the
' ClientOriginator with the ClientTarget.
' It performs the following main tasks:
' 1)Creates a UDP client to receive data on a specific port
' using IPv6 addresses.
' 2)Joins or create a multicast group at the specified address.
' 3)Defines the endpoint port to send data to on the ClientTarget.
' 4)Starts the ClientTarget thread that also creates the ClientTarget object.
' Note this method is the counterpart of the
' ClientTarget.StartMulticastConversation().
Public Shared Function ConnectOriginatorAndTarget() As Boolean
Try
' Bind and listen on port 2000. This constructor creates a socket
' and binds it to the port on which to receive data. The family
' parameter specifies that this connection uses an IPv6 address.
clientOriginator = New UdpClient(2000, AddressFamily.InterNetworkV6)
' Join or create a multicast group. The multicast address ranges
' to use are specified in RFC#2375. You are free to use
' different addresses.
' Transform the string address into the internal format.
m_GrpAddr = IPAddress.Parse("FF01::1")
' Display the multicast address used.
Console.WriteLine(("Multicast Address: [" + m_GrpAddr.ToString() + "]"))
' Exercise the use of the IPv6MulticastOption.
Console.WriteLine("Instantiate IPv6MulticastOption(IPAddress)")
' Instantiate IPv6MulticastOption using one of the
' overloaded constructors.
Dim ipv6MulticastOption As New IPv6MulticastOption(m_GrpAddr)
' Store the IPAdress multicast options.
Dim group As IPAddress = ipv6MulticastOption.Group
Dim interfaceIndex As Long = ipv6MulticastOption.InterfaceIndex
' Display IPv6MulticastOption properties.
Console.WriteLine(("IPv6MulticastOption.Group: [" + group.ToString() + "]"))
Console.WriteLine(("IPv6MulticastOption.InterfaceIndex: [" + interfaceIndex.ToString() + "]"))
' Instantiate IPv6MulticastOption using another
' overloaded constructor.
Dim ipv6MulticastOption2 As New IPv6MulticastOption(group, interfaceIndex)
' Store the IPAdress multicast options.
group = ipv6MulticastOption2.Group
interfaceIndex = ipv6MulticastOption2.InterfaceIndex
' Display the IPv6MulticastOption2 properties.
Console.WriteLine(("IPv6MulticastOption.Group: [" + group.ToString() + "]"))
Console.WriteLine(("IPv6MulticastOption.InterfaceIndex: [" + interfaceIndex.ToString() + "]"))
' Join the specified multicast group using one of the
' JoinMulticastGroup overloaded methods.
clientOriginator.JoinMulticastGroup(Fix(interfaceIndex), group)
' Define the endpoint data port. Note that this port number
' must match the ClientTarget UDP port number which is the
' port on which the ClientTarget is receiving data.
m_ClientTargetdest = New IPEndPoint(m_GrpAddr, 1000)
' Start the ClientTarget thread so it is ready to receive.
m_t = New Thread(New ThreadStart(AddressOf ClientTarget.StartMulticastConversation))
m_t.Start()
' Make sure that the thread has started.
Thread.Sleep(2000)
Return True
Catch e As Exception
Console.WriteLine(("[ClientOriginator.ConnectClients] Exception: " + e.ToString()))
Return False
End Try
End Function 'ConnectOriginatorAndTarget
' The SendAndReceive performs the data exchange
' between the ClientOriginator and the ClientTarget classes.
Public Shared Function SendAndReceive() As String
Dim Ret As String = ""
' Send data to ClientTarget.
Console.WriteLine(ControlChars.Lf + "The ClientOriginator sent:" + ControlChars.Lf)
Send.OriginatorSendData(clientOriginator, m_ClientTargetdest)
' Receive data from ClientTarget
Ret = Receive.ReceiveUntilStop(clientOriginator)
' Stop the ClientTarget thread
m_t.Abort()
' Abandon the multicast group.
clientOriginator.DropMulticastGroup(m_GrpAddr)
Return Ret
End Function 'SendAndReceive
'This is the console application entry point.
Public Shared Sub Main()
' Join the multicast group.
If ConnectOriginatorAndTarget() Then
' Perform a multicast conversation with the ClientTarget.
Dim Ret As String = SendAndReceive()
Console.WriteLine((ControlChars.Lf + "The ClientOriginator received: " + ControlChars.Lf + ControlChars.Lf + Ret))
Else
Console.WriteLine("Unable to Join the multicast group")
End If
End Sub 'Main
End Class 'ClientOriginator
[C#]
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Threading;
namespace Mssc.TransportProtocols.Utilities
{
// The following Receive class is used by both the ClientOriginator and
// the ClientTarget class to receive data from one another..
public class Receive
{
// The following static method performs the actual data
// exchange. In particular, it performs the following tasks:
// 1)Establishes a communication endpoint.
// 2)Receive data through this end point on behalf of the
// caller.
// 3) Returns the received data in ASCII format.
public static string ReceiveUntilStop(UdpClient c)
{
String strData = "";
String Ret = "";
ASCIIEncoding ASCII = new ASCIIEncoding();
// Establish the communication endpoint.
IPEndPoint endpoint = new IPEndPoint(IPAddress.IPv6Any, 50);
while (!strData.Equals("Over"))
{
Byte[] data = c.Receive(ref endpoint);
strData = ASCII.GetString(data);
Ret += strData + "\n";
}
return Ret;
}
}
// The following Send class is used by both the ClientOriginator and
// ClientTarget classes to send data to one another.
public class Send
{
private static char[] greetings = { 'H', 'e', 'l', 'l', 'o', ' ',
'T', 'a', 'r', 'g', 'e', 't', '.' };
private static char[] nice = { 'H', 'a', 'v', 'e', ' ', 'a', ' ', 'n', 'i',
'c', 'e', ' ', 'd', 'a', 'y', '.' };
private static char [] eom = { 'O', 'v', 'e', 'r'};
private static char[] tGreetings = { 'H', 'e', 'l', 'l', 'o', ' ',
'O', 'r', 'i', 'g', 'i', 'n', 'a', 't', 'o', 'r', '!' };
private static char[] tNice = { 'Y', 'o', 'u', ' ', 't', 'o', 'o', '.'};
// The following static method sends data to the ClientTarget on
// behalf of the ClientOriginator.
public static void OriginatorSendData(UdpClient c, IPEndPoint ep)
{
Console.WriteLine(new string(greetings));
c.Send(GetByteArray(greetings), greetings.Length, ep);
Thread.Sleep(1000);
Console.WriteLine(new String(nice));
c.Send(GetByteArray(nice), nice.Length, ep);
Thread.Sleep(1000);
Console.WriteLine(new String(eom));
c.Send(GetByteArray(eom), eom.Length, ep);
}
// The following static method sends data to the ClientOriginator on
// behalf of the ClientTarget.
public static void TargetSendData(UdpClient c, IPEndPoint ep)
{
Console.WriteLine(new string(tGreetings));
c.Send(GetByteArray(tGreetings), tGreetings.Length, ep);
Thread.Sleep(1000);
Console.WriteLine(new String(tNice));
c.Send(GetByteArray(tNice), tNice.Length, ep);
Thread.Sleep(1000);
Console.WriteLine(new String(eom));
c.Send(GetByteArray(eom), eom.Length, ep);
}
// Internal utility
private static Byte[] GetByteArray(Char[] ChArray)
{
Byte[] Ret = new Byte[ChArray.Length];
for (int i = 0; i < ChArray.Length; i++)
Ret[i] = (Byte) ChArray[i];
return Ret;
}
}
// The ClientTarget class is the receiver of the ClientOriginator
// messages. The StartMulticastConversation method contains the
// logic for exchanging data between the ClientTarget and its
// counterpart ClientOriginator in a multicast operation.
public class ClientTarget
{
private static UdpClient m_ClientTarget;
private static IPAddress m_GrpAddr;
// The following StartMulticastConversation method connects the UDP
// ClientTarget with the ClientOriginator.
// It performs the following main tasks:
// 1)Creates a UDP client to receive data on a specific port and using
// IPv6 addresses. The port is the same one used by the ClientOriginator
// to define its communication endpoint.
// 2)Joins or creates a multicast group at the specified address.
// 3)Defines the endpoint port to send data to the ClientOriginator.
// 4)Receives data from the ClientOriginator until the end of the
// communication.
// 5)Sends data to the ClientOriginator.
// Note this method is the counterpart of the
// ClientOriginator.ConnectOriginatorAndTarget().
public static void StartMulticastConversation()
{
string Ret;
// Bind and listen on port 1000. Specify the IPv6 address family type.
m_ClientTarget = new UdpClient(1000, AddressFamily.InterNetworkV6);
// Join or create a multicast group
m_GrpAddr = IPAddress.Parse("FF01::1");
// Use the overloaded JoinMulticastGroup method.
// Refer to the ClientOriginator method to see how to use the other
// methods.
m_ClientTarget.JoinMulticastGroup(m_GrpAddr);
// Define the endpoint data port. Note that this port number
// must match the ClientOriginator UDP port number which is the
// port on which the ClientOriginator is receiving data.
IPEndPoint ClientOriginatordest = new IPEndPoint(m_GrpAddr, 2000);
// Receive data from the ClientOriginator.
Ret = Receive.ReceiveUntilStop(m_ClientTarget);
Console.WriteLine("\nThe ClientTarget received: " + "\n\n" + Ret + "\n");
// Done receiving, now respond to the ClientOriginator.
// Wait to make sure the ClientOriginator is ready to receive.
Thread.Sleep(2000);
Console.WriteLine("\nThe ClientTarget sent:\n");
Send.TargetSendData(m_ClientTarget, ClientOriginatordest);
// Exit the multicast conversation.
m_ClientTarget.DropMulticastGroup(m_GrpAddr);
}
}
// The following ClientOriginator class starts the multicast conversation
// with the ClientTarget class..
// It performs the following main tasks:
// 1)Creates a socket and binds it to the port on which to communicate.
// 2)Specifies that the connection must use an IPv6 address.
// 3)Joins or create a multicast group.
// Note that the multicast address ranges to use are specified
// in the RFC#2375.
// 4)Defines the endpoint to send the data to and starts the
// client target (ClientTarget) thread.
public class ClientOriginator
{
private static UdpClient clientOriginator;
private static IPAddress m_GrpAddr;
private static IPEndPoint m_ClientTargetdest;
private static Thread m_t;
// The ConnectOriginatorAndTarget method connects the
// ClientOriginator with the ClientTarget.
// It performs the following main tasks:
// 1)Creates a UDP client to receive data on a specific port
// using IPv6 addresses.
// 2)Joins or create a multicast group at the specified address.
// 3)Defines the endpoint port to send data to on the ClientTarget.
// 4)Starts the ClientTarget thread that also creates the ClientTarget object.
// Note this method is the counterpart of the
// ClientTarget.StartMulticastConversation().
public static bool ConnectOriginatorAndTarget()
{
try
{
// Bind and listen on port 2000. This constructor creates a socket
// and binds it to the port on which to receive data. The family
// parameter specifies that this connection uses an IPv6 address.
clientOriginator = new UdpClient(2000, AddressFamily.InterNetworkV6);
// Join or create a multicast group. The multicast address ranges
// to use are specified in RFC#2375. You are free to use
// different addresses.
// Transform the string address into the internal format.
m_GrpAddr = IPAddress.Parse("FF01::1");
// Display the multicast address used.
Console.WriteLine("Multicast Address: [" + m_GrpAddr.ToString() + "]");
// Exercise the use of the IPv6MulticastOption.
Console.WriteLine("Instantiate IPv6MulticastOption(IPAddress)");
// Instantiate IPv6MulticastOption using one of the
// overloaded constructors.
IPv6MulticastOption ipv6MulticastOption = new IPv6MulticastOption(m_GrpAddr);
// Store the IPAdress multicast options.
IPAddress group = ipv6MulticastOption.Group;
long interfaceIndex = ipv6MulticastOption.InterfaceIndex;
// Display IPv6MulticastOption properties.
Console.WriteLine("IPv6MulticastOption.Group: [" + group + "]");
Console.WriteLine("IPv6MulticastOption.InterfaceIndex: [" + interfaceIndex + "]");
// Instantiate IPv6MulticastOption using another
// overloaded constructor.
IPv6MulticastOption ipv6MulticastOption2 = new IPv6MulticastOption(group, interfaceIndex);
// Store the IPAdress multicast options.
group = ipv6MulticastOption2.Group;
interfaceIndex = ipv6MulticastOption2.InterfaceIndex;
// Display the IPv6MulticastOption2 properties.
Console.WriteLine("IPv6MulticastOption.Group: [" + group + "]");
Console.WriteLine("IPv6MulticastOption.InterfaceIndex: [" + interfaceIndex + "]");
// Join the specified multicast group using one of the
// JoinMulticastGroup overloaded methods.
clientOriginator.JoinMulticastGroup((int)interfaceIndex, group);
// Define the endpoint data port. Note that this port number
// must match the ClientTarget UDP port number which is the
// port on which the ClientTarget is receiving data.
m_ClientTargetdest = new IPEndPoint(m_GrpAddr, 1000);
// Start the ClientTarget thread so it is ready to receive.
m_t = new Thread(new ThreadStart(ClientTarget.StartMulticastConversation));
m_t.Start();
// Make sure that the thread has started.
Thread.Sleep(2000);
return true;
}
catch (Exception e)
{
Console.WriteLine("[ClientOriginator.ConnectClients] Exception: " + e.ToString());
return false;
}
}
// The SendAndReceive performs the data exchange
// between the ClientOriginator and the ClientTarget classes.
public static string SendAndReceive()
{
string Ret = "";
// Send data to ClientTarget.
Console.WriteLine("\nThe ClientOriginator sent:\n");
Send.OriginatorSendData(clientOriginator, m_ClientTargetdest);
// Receive data from ClientTarget
Ret = Receive.ReceiveUntilStop(clientOriginator);
// Stop the ClientTarget thread
m_t.Abort();
// Abandon the multicast group.
clientOriginator.DropMulticastGroup(m_GrpAddr);
return Ret;
}
//This is the console application entry point.
public static void Main()
{
// Join the multicast group.
if (ConnectOriginatorAndTarget())
{
// Perform a multicast conversation with the ClientTarget.
string Ret = SendAndReceive();
Console.WriteLine("\nThe ClientOriginator received: " + "\n\n" + Ret);
}
else
{
Console.WriteLine("Unable to Join the multicast group");
}
}
}
}
[C++]
#using <mscorlib.dll>
#using <System.dll>
using namespace System;
using namespace System::Net;
using namespace System::Net::Sockets;
using namespace System::Text;
using namespace System::IO;
using namespace System::Threading;
//namespace Mssc::TransportProtocols::Utilities {
// The following Receive class is used by both the ClientOriginator and
// the ClientTarget class to receive data from one another..
public __gc class Receive {
// The following static method performs the actual data
// exchange. In particular, it performs the following tasks:
// 1)Establishes a communication endpoint.
// 2)Receive data through this end point on behalf of the
// caller.
// 3) Returns the received data in ASCII format.
public:
static String* ReceiveUntilStop(UdpClient* c) {
String* strData = S"";
String* Ret = S"";
ASCIIEncoding* ASCII = new ASCIIEncoding();
// Establish the communication endpoint.
IPEndPoint* endpoint = new IPEndPoint(IPAddress::IPv6Any, 50);
while (!strData->Equals(S"Over")) {
Byte data[] = c->Receive(&endpoint);
strData = ASCII->GetString(data);
Ret = String::Concat(Ret, strData, S"\n");
}
return Ret;
}
};
// The following Send class is used by both the ClientOriginator and
// ClientTarget classes to send data to one another.
public __gc class Send {
private:
static Char greetings [] = { 'H', 'e', 'l', 'l', 'o', ' ',
'T', 'a', 'r', 'g', 'e', 't', '->' };
private:
static Char nice[] = { 'H', 'a', 'v', 'e', ' ', 'a', ' ', 'n', 'i',
'c', 'e', ' ', 'd', 'a', 'y', '->' };
private:
static Char eom[] = { 'O', 'v', 'e', 'r'};
private:
static Char tGreetings[] = { 'H', 'e', 'l', 'l', 'o', ' ',
'O', 'r', 'i', 'g', 'i', 'n', 'a', 't', 'o', 'r', '!' };
private:
static Char tNice[] = { 'Y', 'o', 'u', ' ', 't', 'o', 'o', '->'};
// The following static method sends data to the ClientTarget on
// behalf of the ClientOriginator.
public:
static void OriginatorSendData(UdpClient * c, IPEndPoint * ep) {
Console::WriteLine(new String (greetings));
c->Send(GetByteArray(greetings), greetings->Length, ep);
Thread::Sleep(1000);
Console::WriteLine(new String(nice));
c->Send(GetByteArray(nice), nice->Length, ep);
Thread::Sleep(1000);
Console::WriteLine(new String(eom));
c->Send(GetByteArray(eom), eom->Length, ep);
}
// The following static method sends data to the ClientOriginator on
// behalf of the ClientTarget.
public:
static void TargetSendData(UdpClient * c, IPEndPoint * ep) {
Console::WriteLine(new String (tGreetings));
c->Send(GetByteArray(tGreetings), tGreetings->Length, ep);
Thread::Sleep(1000);
Console::WriteLine(new String(tNice));
c->Send(GetByteArray(tNice), tNice->Length, ep);
Thread::Sleep(1000);
Console::WriteLine(new String(eom));
c->Send(GetByteArray(eom), eom->Length, ep);
}
// Internal utility
private:
static Byte GetByteArray(Char ChArray[])[] {
Byte Ret[] = new Byte[ChArray->Length];
for (int i = 0; i < ChArray->Length; i++)
Ret[i] = (Byte) ChArray[i];
return Ret;
}
};
// The ClientTarget class is the receiver of the ClientOriginator
// messages. The StartMulticastConversation method contains the
// logic for exchanging data between the ClientTarget and its
// counterpart ClientOriginator in a multicast operation.
public __gc class ClientTarget {
private:
static UdpClient* m_ClientTarget;
private:
static IPAddress* m_GrpAddr;
// The following StartMulticastConversation method connects the UDP
// ClientTarget with the ClientOriginator.
// It performs the following main tasks:
// 1)Creates a UDP client to receive data on a specific port and using
// IPv6 addresses. The port is the same one used by the ClientOriginator
// to define its communication endpoint.
// 2)Joins or creates a multicast group at the specified address.
// 3)Defines the endpoint port to send data to the ClientOriginator.
// 4)Receives data from the ClientOriginator until the end of the
// communication.
// 5)Sends data to the ClientOriginator.
// Note this method is the counterpart of the
// ClientOriginator::ConnectOriginatorAndTarget().
public:
static void StartMulticastConversation() {
String* Ret;
// Bind and listen on port 1000. Specify the IPv6 address family type.
m_ClientTarget = new UdpClient(1000, AddressFamily::InterNetworkV6);
// Join or create a multicast group
m_GrpAddr = IPAddress::Parse(S"FF01::1");
// Use the overloaded JoinMulticastGroup method.
// Refer to the ClientOriginator method to see how to use the other
// methods.
m_ClientTarget->JoinMulticastGroup(m_GrpAddr);
// Define the endpoint data port. Note that this port number
// must match the ClientOriginator UDP port number which is the
// port on which the ClientOriginator is receiving data.
IPEndPoint* ClientOriginatordest = new IPEndPoint(m_GrpAddr, 2000);
// Receive data from the ClientOriginator.
Ret = Receive::ReceiveUntilStop(m_ClientTarget);
Console::WriteLine(S"\nThe ClientTarget received: \n\n {0}\n", Ret);
// Done receiving, now respond to the ClientOriginator.
// Wait to make sure the ClientOriginator is ready to receive.
Thread::Sleep(2000);
Console::WriteLine(S"\nThe ClientTarget sent:\n");
Send::TargetSendData(m_ClientTarget, ClientOriginatordest);
// Exit the multicast conversation.
m_ClientTarget->DropMulticastGroup(m_GrpAddr);
}
};
// The following ClientOriginator class starts the multicast conversation
// with the ClientTarget class..
// It performs the following main tasks:
// 1)Creates a socket and binds it to the port on which to communicate.
// 2)Specifies that the connection must use an IPv6 address.
// 3)Joins or create a multicast group.
// Note that the multicast address ranges to use are specified
// in the RFC#2375.
// 4)Defines the endpoint to send the data to and starts the
// client target (ClientTarget) thread.
public __gc class ClientOriginator {
private:
static UdpClient* clientOriginator;
private:
static IPAddress* m_GrpAddr;
private:
static IPEndPoint* m_ClientTargetdest;
private:
static Thread* m_t;
// The ConnectOriginatorAndTarget method connects the
// ClientOriginator with the ClientTarget.
// It performs the following main tasks:
// 1)Creates a UDP client to receive data on a specific port
// using IPv6 addresses.
// 2)Joins or create a multicast group at the specified address.
// 3)Defines the endpoint port to send data to on the ClientTarget.
// 4)Starts the ClientTarget thread that also creates the ClientTarget Object*.
// Note this method is the counterpart of the
// ClientTarget::StartMulticastConversation().
public:
static bool ConnectOriginatorAndTarget() {
try {
// Bind and listen on port 2000. This constructor creates a socket
// and binds it to the port on which to receive data. The family
// parameter specifies that this connection uses an IPv6 address.
clientOriginator = new UdpClient(2000, AddressFamily::InterNetworkV6);
// Join or create a multicast group. The multicast address ranges
// to use are specified in RFC#2375. You are free to use
// different addresses.
// Transform the String* address into the internal format.
m_GrpAddr = IPAddress::Parse(S"FF01::1");
// Display the multicast address used.
Console::WriteLine(S"Multicast Address: [ {0}]", m_GrpAddr);
// Exercise the use of the IPv6MulticastOption.
Console::WriteLine(S"Instantiate IPv6MulticastOption(IPAddress)");
// Instantiate IPv6MulticastOption using one of the
// overloaded constructors.
IPv6MulticastOption* ipv6MulticastOption = new IPv6MulticastOption(m_GrpAddr);
// Store the IPAdress multicast options.
IPAddress * group = ipv6MulticastOption->Group;
__int64 interfaceIndex = ipv6MulticastOption->InterfaceIndex;
// Display IPv6MulticastOption properties.
Console::WriteLine(S"IPv6MulticastOption::Group: [ {0}]", group);
Console::WriteLine(S"IPv6MulticastOption::InterfaceIndex: [ {0}]", __box(interfaceIndex));
// Instantiate IPv6MulticastOption using another
// overloaded constructor.
IPv6MulticastOption* ipv6MulticastOption2 =
new IPv6MulticastOption(group, interfaceIndex);
// Store the IPAdress multicast options.
group = ipv6MulticastOption2->Group;
interfaceIndex = ipv6MulticastOption2->InterfaceIndex;
// Display the IPv6MulticastOption2 properties.
Console::WriteLine(S"IPv6MulticastOption::Group: [ {0} ]", group);
Console::WriteLine(S"IPv6MulticastOption::InterfaceIndex: [ {0} ]", __box(interfaceIndex));
// Join the specified multicast group using one of the
// JoinMulticastGroup overloaded methods.
clientOriginator->JoinMulticastGroup((int)interfaceIndex, group);
// Define the endpoint data port. Note that this port number
// must match the ClientTarget UDP port number which is the
// port on which the ClientTarget is receiving data.
m_ClientTargetdest = new IPEndPoint(m_GrpAddr, 1000);
// Start the ClientTarget thread so it is ready to receive.
m_t = new Thread(new ThreadStart(0, ClientTarget::StartMulticastConversation));
m_t->Start();
// Make sure that the thread has started.
Thread::Sleep(2000);
return true;
} catch (Exception* e) {
Console::WriteLine(S"[ClientOriginator::ConnectClients] Exception: {0}", e);
return false;
}
}
// The SendAndReceive performs the data exchange
// between the ClientOriginator and the ClientTarget classes.
public:
static String* SendAndReceive() {
String* Ret = S"";
// Send data to ClientTarget.
Console::WriteLine(S"\nThe ClientOriginator sent:\n");
Send::OriginatorSendData(clientOriginator, m_ClientTargetdest);
// Receive data from ClientTarget
Ret = Receive::ReceiveUntilStop(clientOriginator);
// Stop the ClientTarget thread
m_t->Abort();
// Abandon the multicast group.
clientOriginator->DropMulticastGroup(m_GrpAddr);
return Ret;
}
};
//}
//This is the console application entry point.
int main() {
// Join the multicast group.
if (ClientOriginator::ConnectOriginatorAndTarget()) {
// Perform a multicast conversation with the ClientTarget.
String* Ret = ClientOriginator::SendAndReceive();
Console::WriteLine(S"\nThe ClientOriginator received: \n\n {0}", Ret);
} else {
Console::WriteLine(S"Unable to Join the multicast group");
}
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
参照
UdpClient クラス | UdpClient メンバ | System.Net.Sockets 名前空間 | UdpClient.JoinMulticastGroup オーバーロードの一覧 | DropMulticastGroup