UdpClient.JoinMulticastGroup 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
将 UdpClient 添加到多播组。
重载
JoinMulticastGroup(IPAddress) |
将 UdpClient 添加到多播组。 |
JoinMulticastGroup(Int32, IPAddress) |
将 UdpClient 添加到多播组。 |
JoinMulticastGroup(IPAddress, Int32) |
将 UdpClient 添加到具有指定生存时间 (TTL) 的多播组。 |
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)
参数
例外
已关闭基础 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使用指定的 IPAddress将 订阅UdpClient到多播组。 调用 JoinMulticastGroup 方法后,基础 Socket 将 Internet 组管理协议 (IGMP) 数据包发送到请求加入多播组的路由器。 多播地址范围为 224.0.0.0 到 239.255.255.255。 如果指定此范围之外的地址,或者发出请求的路由器未启用多播, UdpClient 将引发 SocketException。 如果收到 SocketException,请使用 SocketException.ErrorCode 获取特定的错误代码。 获取此代码后,可以参阅 Windows 套接字版本 2 API 错误代码 文档,获取错误的详细说明。 将 UdpClient 与路由器一起列为多播组的成员后,它将能够接收发送到指定 IPAddress的多播数据报。
注意
必须使用多播端口号创建 UdpClient ;否则,将无法接收多播数据报。 请勿在 Connect 调用 方法之前调用 JoinMulticastGroup 方法,否则该方法 Receive 将不起作用。 无需属于多播组即可将数据报发送到多播 IP 地址。
在加入多播组之前,请确保套接字绑定到端口或终结点。 为此,可以调用接受端口或终结点作为参数的构造函数之一。
若要停止接收多播数据报,请调用 DropMulticastGroup 方法并提供 IPAddress 要从中撤回的组的 。
注意
在 IPv6 情况下,可以选择多个多播地址范围。 请参阅 IETF RFC 2375。
注意
不能在UdpClient没有特定本地端口 (构造的 上调用 JoinMulticastGroup ,即使用 UdpClient() 或 UdpClient(AddressFamily) 构造函数) 。
另请参阅
适用于
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 地址关联的接口索引。
例外
已关闭基础 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没有特定本地端口 (构造的 上调用 JoinMulticastGroup ,即使用 UdpClient.UdpClient() 或 UdpClient.UdpClient(AddressFamily) 构造函数) 。
适用于
JoinMulticastGroup(IPAddress, Int32)
- Source:
- UDPClient.cs
- Source:
- UDPClient.cs
- Source:
- UDPClient.cs
将 UdpClient 添加到具有指定生存时间 (TTL) 的多播组。
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)
参数
- timeToLive
- Int32
生存时间 (TTL),以路由器跃点数为单位。
例外
所提供的 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使用指定的 IPAddress将 订阅UdpClient到多播组。 调用 JoinMulticastGroup 方法后,基础 Socket 将 Internet 组管理协议 (IGMP) 数据包发送到请求加入多播组的路由器。 多播地址范围为 224.0.0.0 到 239.255.255.255。 如果指定此范围之外的地址,或者发出请求的路由器未启用多播, UdpClient 将引发 SocketException。 如果收到 SocketException,请使用 SocketException.ErrorCode 获取特定的错误代码。 获取此代码后,可以参阅 Windows 套接字版本 2 API 错误代码 文档,获取错误的详细说明。 参数 timeToLive
指定在放弃多播数据报之前允许的路由器跃点数。 将 UdpClient 与路由器一起列为多播组的成员后,它将能够接收发送到指定 IPAddress的多播数据报。
注意
必须使用多播端口号创建 UdpClient ,否则将无法接收多播数据报。 请勿在 Connect 调用 方法之前调用 方法, JoinMulticastGroup 否则接收方法将不起作用。 无需属于多播组即可将数据报发送到多播 IP 地址。
在加入多播组之前,请确保套接字绑定到端口或终结点。 为此,可以调用接受作为端口或终结点参数的构造函数之一。
若要停止接收多播数据报,请调用 DropMulticastGroup 方法并提供 IPAddress 要从中撤回的组的 。
注意
不能在UdpClient没有特定本地端口 (构造的 上调用 JoinMulticastGroup ,即使用 UdpClient() 或 UdpClient(AddressFamily) 构造函数) 。
另请参阅
适用于
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)
参数
例外
已关闭基础 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没有特定本地端口 (构造的 上调用 JoinMulticastGroup ,即使用 UdpClient() 或 UdpClient(AddressFamily) 构造函数) 。