2014-05-24 2 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 프로그램의 루프가 멈추지 않는 이유는 무엇입니까? 이 문제를 어떻게 해결할 수 있습니까?

대단히 감사합니다!

+1

리시버가 루프를 빠져 나오게하는 요인은 무엇입니까? 이것은 말이되지 않습니다. –

+0

@Daniel Kelley, 보낸 사람에 루프가 깨졌을 때 콘솔에 다음과 같이 쓰여 있습니다 : '계속하려면 아무 키나 누르십시오 ...'그래서 클라이언트 쪽의 루프는 stil 리스닝이기 때문에 중단되지 않습니다. – user3649515

+0

글쎄, 코드가 편집되어 어디에서 깨지기 쉬운 지 알 수 있습니다. –

답변

1

udp 소켓을 만들고 있습니다. Udp 소켓은 연결 지향적이지 않습니다. 따라서 메시지를 수신하고 보낸 사람의 상태를 알 수 없습니다. 발신자 소켓이 닫히더라도 수신자는 계속 청취합니다. 귀하의 질문을 올바르게 이해했기를 바랍니다.

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

메시지 '안녕!'이 올 때까지 서버에서 메시지를 보내려고합니다. 수신자가 '안녕히 계십시오!'라는 메시지를받은 후 루프를 깨지 않습니다. 나는 왜 그런지 이해하지 못한다 ... – user3649515

+0

나는 코드를 컴파일하지 않았지만, 나의 대답 편집의 코드가 작동해야한다고 생각한다. – Saibal

+0

아니요, 도움이되지 않습니다. 내 코드를 편집했습니다. 또한 나는 왜 모든 수신 메시지가 콘솔에 쓰여진 공간이 많은지 모르겠다. 보낸 메시지 만 인쇄하려면 어떻게해야합니까? – user3649515

관련 문제