2014-05-24 48 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