UdpClient.JoinMulticastGroup 메서드

정의

멀티캐스트 그룹에 UdpClient를 추가합니다.

오버로드

JoinMulticastGroup(IPAddress)

멀티캐스트 그룹에 UdpClient를 추가합니다.

JoinMulticastGroup(Int32, IPAddress)

멀티캐스트 그룹에 UdpClient를 추가합니다.

JoinMulticastGroup(IPAddress, Int32)

지정된 TTL(Time to Live)을 사용하여 멀티캐스트 그룹에 UdpClient를 추가합니다.

JoinMulticastGroup(IPAddress, IPAddress)

멀티캐스트 그룹에 UdpClient를 추가합니다.

JoinMulticastGroup(IPAddress)

Source:
UDPClient.cs
Source:
UDPClient.cs
Source:
UDPClient.cs

멀티캐스트 그룹에 UdpClient를 추가합니다.

public:
 void JoinMulticastGroup(System::Net::IPAddress ^ multicastAddr);
public void JoinMulticastGroup (System.Net.IPAddress multicastAddr);
member this.JoinMulticastGroup : System.Net.IPAddress -> unit
Public Sub JoinMulticastGroup (multicastAddr As IPAddress)

매개 변수

multicastAddr
IPAddress

가입할 그룹의 멀티캐스트 IPAddress입니다.

예외

내부 Socket이 닫힌 경우

소켓에 액세스할 때 오류가 발생했습니다.

IP 주소가 소켓의 주소 지정 체계를 정의하는 AddressFamily 값과 호환되지 않는 경우

예제

다음 코드 예제에서는 멀티캐스트 주소를 제공하여 멀티캐스트 그룹에 조인하는 방법을 보여 줍니다.

#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;

// The following Receive class is used by both the ClientOriginator and
// the ClientTarget class to receive data from one another..
public ref class Receive
{
public:

   // 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.
   static String^ ReceiveUntilStop( UdpClient^ c )
   {
      String^ strData = "";
      String^ Ret = "";
      ASCIIEncoding^ ASCII = gcnew ASCIIEncoding;
      
      // Establish the communication endpoint.
      IPEndPoint^ endpoint = gcnew IPEndPoint( IPAddress::IPv6Any,50 );
      while (  !strData->Equals( "Over" ) )
      {
         array<Byte>^data = c->Receive( endpoint );
         strData = ASCII->GetString( data );
         Ret = String::Concat( 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 ref class Send
{
private:
   static array<Char>^greetings = {'H','e','l','l','o',' ','T','a','r','g','e','t','->'};
   static array<Char>^nice = {'H','a','v','e',' ','a',' ','n','i','c','e',' ','d','a','y','->'};
   static array<Char>^eom = {'O','v','e','r'};
   static array<Char>^tGreetings = {'H','e','l','l','o',' ','O','r','i','g','i','n','a','t','o','r','!'};
   static array<Char>^tNice = {'Y','o','u',' ','t','o','o','->'};

public:

   // The following static method sends data to the ClientTarget on
   // behalf of the ClientOriginator.
   static void OriginatorSendData( UdpClient^ c, IPEndPoint^ ep )
   {
      Console::WriteLine( gcnew String( greetings ) );
      c->Send( GetByteArray( greetings ), greetings->Length, ep );
      Thread::Sleep( 1000 );
      Console::WriteLine( gcnew String( nice ) );
      c->Send( GetByteArray( nice ), nice->Length, ep );
      Thread::Sleep( 1000 );
      Console::WriteLine( gcnew String( eom ) );
      c->Send( GetByteArray( eom ), eom->Length, ep );
   }


   // The following static method sends data to the ClientOriginator on
   // behalf of the ClientTarget.
   static void TargetSendData( UdpClient^ c, IPEndPoint^ ep )
   {
      Console::WriteLine( gcnew String( tGreetings ) );
      c->Send( GetByteArray( tGreetings ), tGreetings->Length, ep );
      Thread::Sleep( 1000 );
      Console::WriteLine( gcnew String( tNice ) );
      c->Send( GetByteArray( tNice ), tNice->Length, ep );
      Thread::Sleep( 1000 );
      Console::WriteLine( gcnew String( eom ) );
      c->Send( GetByteArray( eom ), eom->Length, ep );
   }


private:

   // Internal utility
   static array<Byte>^ GetByteArray( array<Char>^ChArray )
   {
      array<Byte>^Ret = gcnew array<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 ref class ClientTarget
{
private:
   static UdpClient^ m_ClientTarget;
   static IPAddress^ m_GrpAddr;

public:

   // 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().
   static void StartMulticastConversation()
   {
      String^ Ret;
      
      // Bind and listen on port 1000. Specify the IPv6 address family type.
      m_ClientTarget = gcnew 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 = gcnew IPEndPoint( m_GrpAddr,2000 );
      
      // Receive data from the ClientOriginator.
      Ret = Receive::ReceiveUntilStop( m_ClientTarget );
      Console::WriteLine( "\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( "\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 ref class ClientOriginator
{
private:
   static UdpClient^ clientOriginator;
   static IPAddress^ m_GrpAddr;
   static IPEndPoint^ m_ClientTargetdest;
   static Thread^ m_t;

public:

   // 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().
   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 = gcnew 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: [ {0}]", m_GrpAddr );
         
         // Exercise the use of the IPv6MulticastOption.
         Console::WriteLine( "Instantiate IPv6MulticastOption(IPAddress)" );
         
         // Instantiate IPv6MulticastOption using one of the
         // overloaded constructors.
         IPv6MulticastOption^ ipv6MulticastOption = gcnew IPv6MulticastOption( m_GrpAddr );
         
         // Store the IPAdress multicast options.
         IPAddress^ group = ipv6MulticastOption->Group;
         __int64 interfaceIndex = ipv6MulticastOption->InterfaceIndex;
         
         // Display IPv6MulticastOption properties.
         Console::WriteLine( "IPv6MulticastOption::Group: [ {0}]", group );
         Console::WriteLine( "IPv6MulticastOption::InterfaceIndex: [ {0}]", interfaceIndex );
         
         // Instantiate IPv6MulticastOption using another
         // overloaded constructor.
         IPv6MulticastOption^ ipv6MulticastOption2 = gcnew IPv6MulticastOption( group,interfaceIndex );
         
         // Store the IPAdress multicast options.
         group = ipv6MulticastOption2->Group;
         interfaceIndex = ipv6MulticastOption2->InterfaceIndex;
         
         // Display the IPv6MulticastOption2 properties.
         Console::WriteLine( "IPv6MulticastOption::Group: [ {0} ]", group );
         Console::WriteLine( "IPv6MulticastOption::InterfaceIndex: [ {0} ]", 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 = gcnew IPEndPoint( m_GrpAddr,1000 );
         
         // Start the ClientTarget thread so it is ready to receive.
         m_t = gcnew Thread( gcnew 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: {0}", e );
         return false;
      }

   }


   // The SendAndReceive performs the data exchange
   // between the ClientOriginator and the ClientTarget classes.
   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.
int main()
{
   
   // Join the multicast group.
   if ( ClientOriginator::ConnectOriginatorAndTarget() )
   {
      
      // Perform a multicast conversation with the ClientTarget.
      String^ Ret = ClientOriginator::SendAndReceive();
      Console::WriteLine( "\nThe ClientOriginator received: \n\n {0}", Ret );
   }
   else
   {
      Console::WriteLine( "Unable to Join the multicast group" );
   }
}
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");
      }
    }
}
}
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Imports System.Threading

' 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

' 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
   
   
   ' 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
   
   ' 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


' 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
End Class


' 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
End Class

설명

메서드는 JoinMulticastGroup 지정된 IPAddressUdpClient 사용하여 를 멀티캐스트 그룹에 구독합니다. 메서드를 호출한 JoinMulticastGroup 후 기본 Socket 은 멀티캐스트 그룹에 멤버 자격을 요청하는 라우터에 IGMP(인터넷 그룹 관리 프로토콜) 패킷을 보냅니다. 멀티캐스트 주소 범위는 224.0.0.0에서 239.255.255.255입니다. 이 범위를 벗어나는 주소를 지정하거나 요청이 수행되는 라우터가 멀티캐스트를 사용하도록 설정되지 않은 경우 는 UdpClient 을 throw합니다 SocketException. 를 수신하는 SocketException경우 를 사용하여 SocketException.ErrorCode 특정 오류 코드를 가져옵니다. 이 코드를 가져온 후에는 Windows 소켓 버전 2 API 오류 코드 설명서를 참조하여 오류에 대한 자세한 설명을 확인할 수 있습니다. UdpClient 가 멀티캐스트 그룹의 멤버로 라우터와 함께 나열되면 지정된 IPAddress로 전송된 멀티캐스트된 데이터그램을 받을 수 있습니다.

참고

멀티캐스트 포트 번호를 사용하여 를 UdpClient 만들어야 합니다. 그렇지 않으면 멀티캐스트된 데이터그램을 받을 수 없습니다. 메서드를 Connect 호출하기 전에 메서드를 JoinMulticastGroup 호출하지 마세요. 그렇지 않으면 메서드가 Receive 작동하지 않습니다. 멀티캐스트 IP 주소로 데이터그램을 보내려면 멀티캐스트 그룹에 속할 필요가 없습니다.

멀티캐스트 그룹에 조인하기 전에 소켓이 포트 또는 엔드포인트에 바인딩되어 있는지 확인합니다. 이렇게 하려면 포트 또는 엔드포인트를 매개 변수로 허용하는 생성자 중 하나를 호출합니다.

멀티캐스트된 데이터그램 수신을 중지하려면 메서드를 DropMulticastGroup 호출하고 철회할 그룹의 를 제공합니다 IPAddress .

참고

IPv6의 경우 선택할 수 있는 여러 멀티캐스트 주소 범위가 있습니다. IETF RFC 2375를 참조하세요.

참고

특정 로컬 포트(즉, 또는 UdpClient(AddressFamily) 생성자를 사용)가 없으면 생성된 에서 를 호출 JoinMulticastGroupUdpClientUdpClient() 수 없습니다.

추가 정보

적용 대상

JoinMulticastGroup(Int32, IPAddress)

Source:
UDPClient.cs
Source:
UDPClient.cs
Source:
UDPClient.cs

멀티캐스트 그룹에 UdpClient를 추가합니다.

public:
 void JoinMulticastGroup(int ifindex, System::Net::IPAddress ^ multicastAddr);
public void JoinMulticastGroup (int ifindex, System.Net.IPAddress multicastAddr);
member this.JoinMulticastGroup : int * System.Net.IPAddress -> unit
Public Sub JoinMulticastGroup (ifindex As Integer, multicastAddr As IPAddress)

매개 변수

ifindex
Int32

멀티캐스트 그룹을 연결할 로컬 IP 주소에 연결된 인터페이스 인덱스입니다.

multicastAddr
IPAddress

가입할 그룹의 멀티캐스트 IPAddress입니다.

예외

내부 Socket이 닫힌 경우

소켓에 액세스할 때 오류가 발생했습니다.

예제

// Instantiate IPv6MulticastOption using another
// overloaded constructor.
IPv6MulticastOption^ ipv6MulticastOption2 = gcnew IPv6MulticastOption( group,interfaceIndex );

// Store the IPAdress multicast options.
group = ipv6MulticastOption2->Group;
interfaceIndex = ipv6MulticastOption2->InterfaceIndex;

// Display the IPv6MulticastOption2 properties.
Console::WriteLine( "IPv6MulticastOption::Group: [ {0} ]", group );
Console::WriteLine( "IPv6MulticastOption::InterfaceIndex: [ {0} ]", interfaceIndex );

// Join the specified multicast group using one of the
// JoinMulticastGroup overloaded methods.
clientOriginator->JoinMulticastGroup( (int)interfaceIndex, group );

// 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);
' 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)

설명

멀티캐스트 그룹을 조인하기 전에 소켓이 포트 또는 엔드포인트에 바인딩되어 있는지 확인합니다. 포트 또는 엔드포인트를 매개 변수로 허용하는 생성자 중 하나를 호출하여 이 작업을 수행할 수 있습니다.

infindex 매개 변수는 동일한 링크에서 하드웨어 인터페이스를 식별하는 데 사용됩니다.

참고

선택할 수 있는 여러 멀티캐스트 주소 범위가 있습니다. IETF RFC 2375를 참조하세요.

참고

특정 로컬 포트(즉, 또는 UdpClient.UdpClient(AddressFamily) 생성자를 사용)가 없으면 생성된 에서 를 호출 JoinMulticastGroupUdpClientUdpClient.UdpClient() 수 없습니다.

적용 대상

JoinMulticastGroup(IPAddress, Int32)

Source:
UDPClient.cs
Source:
UDPClient.cs
Source:
UDPClient.cs

지정된 TTL(Time to Live)을 사용하여 멀티캐스트 그룹에 UdpClient를 추가합니다.

public:
 void JoinMulticastGroup(System::Net::IPAddress ^ multicastAddr, int timeToLive);
public void JoinMulticastGroup (System.Net.IPAddress multicastAddr, int timeToLive);
member this.JoinMulticastGroup : System.Net.IPAddress * int -> unit
Public Sub JoinMulticastGroup (multicastAddr As IPAddress, timeToLive As Integer)

매개 변수

multicastAddr
IPAddress

가입할 멀티캐스트 그룹의 IPAddress입니다.

timeToLive
Int32

라우터 홉 수 단위로 측정된 TTL(Time to Live)입니다.

예외

제공된 TTL이 0에서 255 사이에 없는 경우

내부 Socket이 닫힌 경우

소켓에 액세스할 때 오류가 발생했습니다.

multicastAddr이(가) null인 경우

IP 주소가 소켓의 주소 지정 체계를 정의하는 AddressFamily 값과 호환되지 않는 경우

예제

다음 예제에서는 두 개의 매개 변수, 멀티캐스트 주소 및 TTL을 나타내는 숫자를 제공하여 멀티캐스트 그룹에 조인하는 방법을 보여 줍니다.

UdpClient^ udpClient = gcnew UdpClient;
// Creates an IPAddress to use to join and drop the multicast group.
IPAddress^ multicastIpAddress = IPAddress::Parse( "239.255.255.255" );

try
{
   // The packet dies after 50 router hops.
   udpClient->JoinMulticastGroup( multicastIpAddress, 50 );
}
catch ( Exception^ e ) 
{
   Console::WriteLine( e->ToString() );
}
UdpClient udpClient = new UdpClient();
// Creates an IPAddress to use to join and drop the multicast group.
IPAddress multicastIpAddress = IPAddress.Parse("239.255.255.255");

try{
     // The packet dies after 50 router hops.
     udpClient.JoinMulticastGroup(multicastIpAddress, 50);
}
catch ( Exception e ){
    Console.WriteLine( e.ToString());
}
Dim udpClient As New UdpClient()
' Creates an IP address to use to join and drop the multicast group.
Dim multicastIpAddress As IPAddress = IPAddress.Parse("239.255.255.255")

Try
   ' The packet dies after 50 router hops.
   udpClient.JoinMulticastGroup(multicastIpAddress, 50)
Catch e As Exception
   Console.WriteLine(e.ToString())
End Try

설명

메서드는 JoinMulticastGroup 지정된 IPAddressUdpClient 사용하여 를 멀티캐스트 그룹에 구독합니다. 메서드를 호출한 JoinMulticastGroup 후 기본 Socket 은 멀티캐스트 그룹에 멤버 자격을 요청하는 라우터에 IGMP(인터넷 그룹 관리 프로토콜) 패킷을 보냅니다. 멀티캐스트 주소 범위는 224.0.0.0에서 239.255.255.255입니다. 이 범위를 벗어나는 주소를 지정하거나 요청이 수행되는 라우터가 멀티캐스트를 사용하도록 설정되지 않은 경우 는 UdpClient 을 throw합니다 SocketException. 를 수신하는 SocketException경우 를 사용하여 SocketException.ErrorCode 특정 오류 코드를 가져옵니다. 이 코드를 가져온 후에는 Windows 소켓 버전 2 API 오류 코드 설명서를 참조하여 오류에 대한 자세한 설명을 확인할 수 있습니다. 매개 변수는 timeToLive 삭제되기 전에 멀티캐스트된 데이터그램에 허용되는 라우터 홉 수를 지정합니다. UdpClient 가 멀티캐스트 그룹의 멤버로 라우터와 함께 나열되면 지정된 IPAddress로 전송된 멀티캐스트된 데이터그램을 받을 수 있습니다.

참고

멀티캐스트 포트 번호를 사용하여 를 만들어야 UdpClient 합니다. 그렇지 않으면 멀티캐스트된 데이터그램을 받을 수 없습니다. 메서드를 Connect 호출하기 전에 메서드를 JoinMulticastGroup 호출하지 마세요. 그렇지 않으면 수신 메서드가 작동하지 않습니다. 멀티캐스트 IP 주소로 데이터그램을 보내려면 멀티캐스트 그룹에 속할 필요가 없습니다.

멀티캐스트 그룹을 조인하기 전에 소켓이 포트 또는 엔드포인트에 바인딩되어 있는지 확인합니다. 이렇게 하려면 포트 또는 엔드포인트를 매개 변수로 허용하는 생성자 중 하나를 호출합니다.

멀티캐스트된 데이터그램 수신을 중지하려면 메서드를 DropMulticastGroup 호출하고 철회할 그룹의 를 제공합니다 IPAddress .

참고

특정 로컬 포트(즉, 또는 UdpClient(AddressFamily) 생성자를 사용)가 없으면 생성된 에서 를 호출 JoinMulticastGroupUdpClientUdpClient() 수 없습니다.

추가 정보

적용 대상

JoinMulticastGroup(IPAddress, IPAddress)

Source:
UDPClient.cs
Source:
UDPClient.cs
Source:
UDPClient.cs

멀티캐스트 그룹에 UdpClient를 추가합니다.

public:
 void JoinMulticastGroup(System::Net::IPAddress ^ multicastAddr, System::Net::IPAddress ^ localAddress);
public void JoinMulticastGroup (System.Net.IPAddress multicastAddr, System.Net.IPAddress localAddress);
member this.JoinMulticastGroup : System.Net.IPAddress * System.Net.IPAddress -> unit
Public Sub JoinMulticastGroup (multicastAddr As IPAddress, localAddress As IPAddress)

매개 변수

multicastAddr
IPAddress

가입할 그룹의 멀티캐스트 IPAddress입니다.

localAddress
IPAddress

로컬 IPAddress입니다.

예외

내부 Socket이 닫힌 경우

소켓에 액세스할 때 오류가 발생했습니다.

예제

다음 코드 예제에서는 사용 된 메서드입니다 JoinMulticastGroup .

// Subscribe to a multicast group.
static void DoJoinMulticastGroup( UdpClient^ u, String^ mcast, String^ local )
{
   array<IPAddress^>^ multicastAddress = Dns::GetHostAddresses( mcast );

   u->JoinMulticastGroup( multicastAddress[0] );
   Console::WriteLine(  "Joined multicast Address {0}", multicastAddress );
}
// Subscribe to a multicast group.
public static void DoJoinMulticastGroup(UdpClient u, string mcast)
{
    IPAddress[] multicastAddress = Dns.GetHostAddresses(mcast);

    u.JoinMulticastGroup(multicastAddress[0]);
    Console.WriteLine("Joined multicast Address {0}",
        multicastAddress[0]);
}

설명

멀티캐스트 그룹에 조인하기 전에 소켓이 포트 또는 엔드포인트에 바인딩되어 있는지 확인합니다. 포트 또는 엔드포인트를 매개 변수로 허용하는 생성자 중 하나를 호출하여 이 작업을 수행할 수 있습니다.

참고

선택할 수 있는 여러 멀티캐스트 주소 범위가 있습니다. IETF RFC 2375에서 찾을 수 있습니다.

참고

특정 로컬 포트(즉, 또는 UdpClient(AddressFamily) 생성자를 사용)가 없으면 생성된 에서 를 호출 JoinMulticastGroupUdpClientUdpClient() 수 없습니다.

적용 대상