2014-05-24 50 views
-1

我尝试发送消息给该组的所有成员。发件人:UDP组播。 C#

// Create socket 
     Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

     // Multicast IP-address 
     IPAddress ip = IPAddress.Parse("224.168.55.25"); 

     // Join multicast group 
     s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip)); 

     // TTL 
     s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2); 

     // Create an endpoint 
     IPEndPoint ipep = new IPEndPoint(ip, 4567); 

     // Connect to the endpoint 
     s.Connect(ipep); 

     // Scan message 
     while (true) 
     { 
      byte[] buffer = new byte[1024]; 
      string msg = Console.ReadLine(); 
      buffer = Encoding.ASCII.GetBytes(msg); 
      s.Send(buffer, buffer.Length, SocketFlags.None); 
      if (msg.Equals("Bye!", StringComparison.Ordinal)) 
       break; 
     } 

     // Close socket 
     s.Close(); 

接收机:

// Create new socket 
     Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

     // Create IP endpoint 
     IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 4567); 

     // Bind endpoint to the socket 
     s.Bind(ipep); 

     // Multicast IP-address 
     IPAddress ip = IPAddress.Parse("224.168.55.25"); 

     // Add socket to the multicast group 
     s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, IPAddress.Any)); 

     // Receive messages 
     while (true) 
     { 
      byte[] data = new byte[1024]; 
      s.Receive(data); 
      string str = System.Text.Encoding.ASCII.GetString(data, 0, data.Length); 
      Console.WriteLine(str.Trim()); 
      if (str.Equals("Bye!", StringComparison.Ordinal)) 
      { 
       break; 
      } 
     } 

我不uderstand为什么有很多的消息之间的自由空间,当我打印出来到屏幕上的客户端?为什么在Receiver程序收到消息Bye!后不停止?我该如何解决这个问题?

非常感谢!

+1

接收器内部会导致接收器退出循环?这没有意义。 –

+0

@Daniel Kelley,当发送者的循环中断时,它被写入控制台中:'按任意键继续...'因此,客户端的循环不会中断,因为它仍然在监听 – user3649515

+0

那么,已经编辑了你的代码,它很清楚它应该破坏的地方。 –

回答

1

您正在创建一个udp套接字。 Udp套接字不是面向连接的。所以它只是收到消息,并不知道发件人的状态。即使发件人套接字关闭,接收者也会继续收听。 我希望我已经正确理解你的问题。

if (strData.Trim().Equals("Bye!", StringComparison.Ordinal)) 
{ 
       Console.WriteLine("that's right"); 
       break; 
} 
+0

我想从服务器发送消息,直到消息'再见!'。接收器收到消息“再见!”后不会中断循环。我不明白为什么... – user3649515

+0

我还没有编译代码,但我认为我的答案编辑中的代码应该可以工作......或者我错过了这一点? – Saibal

+0

不,它没有帮助。我编辑了我的代码。另外,我不知道为什么每次收到消息后,控制台中都会写入很多空格?我如何才能打印发送的消息? – user3649515