2011-06-20 7 views
2

グループを作成する&メッセージを送信する方法の1行前にReceiveスレッドを作成してメッセージを待つ。このコードはパーフェクトにで動作します。私はちょうど私がグループに何かを送信しようとする前に、ソケットにグループに参加するためのSendメソッドでこの行を追加してはいけない理由を知りたいだけです。 this articleからSetSocketOption&MulticastOptionに関する質問

server.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, MulticastOption);

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading; 

class MAIN 
{ 
    private static MulticastOption CreateGroup() 
    { 
     return new MulticastOption(IPAddress.Parse("224.100.0.1")); 
    } 
    private static void Receive(MulticastOption MulticastOption) 
    { 
     Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); 
     EndPoint ep = (EndPoint)iep; 
     sock.Bind(iep); 
     sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, MulticastOption); 
     // 
     byte[] data = new byte[1024]; 
     new Thread(new ThreadStart(Send)).Start(); 
     int recv = sock.ReceiveFrom(data, ref ep); 
     String stringData = Encoding.ASCII.GetString(data, 0, recv); 
     Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString()); 
     sock.Close(); 
    } 
    private static void Send() 
    { 
     Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050); 


     byte[] data = Encoding.ASCII.GetBytes("This is a test message"); 
     server.SendTo(data, iep); 
     server.Close(); 
    } 
    public static void Main(String[] args) 
    { 
     Receive(CreateGroup()); 
     Console.ReadKey(); 
    } 
} 

答えて

4

IP_ADD_MEMBERSHIPオプションを使用すると、 マルチキャストアドレス構造内のホストグループアドレスで指定されたマルチキャストグループ に参加する ことができます。 はマルチキャスト データグラムを受信するためにグループに参加する必要があります。 マルチキャストデータグラムを送信するために、 グループに参加する必要はありません。

ただし、これはデフォルトのTTL値のためにローカルサブネットでのみ機能します。より明示的な回答については、this articleを参照してください。