UDPClient e Multicast

Nel corso dell'implementazione dell'archiettura di esempio che ho iniziato a descrivere qui mi sono trovato a combattare con i problemi legati a UdpClient e Multicast. 2 UdpClient  sulla stessa macchina proprio non se la sentono di ascoltare lo stesso gruppo multicast... beh questo bel problema :o Ho cercato in rete per vedere se qualcuno aveva stesso problema.... ma poca roba e anche l'esempio di MSDN, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconusingudpservices.asp, non vuole proprio funzionare.

Ho chiesto in ufficio e un collega - un grazie a Paolo - mi ha girato del codice per fare quello che volevo che però usava esplicitamente le Socket e non usava UdpClient... beh mi son detto ma non è che vale che l'UdpClient non fa quello che dovrebbe fare. Ho continutao le ricerche e gli studi, l'esempio del collega mi aveva fornito le parole giuste con cui cercare! :-D Ho analizzato con reflection l'UdpClient e la mia conclusione è che non viene fatto correttamente il binding.

Ecco quindi la mia soluzione.

class MulticastUdpClient: UdpClient
{
   public MulticastUdpClient(IPEndPoint ipEndPoint)
   {
     //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/setsockopt_2.asp
     //SO_REUSEADDR (BOOL) Allows the socket to be bound to an address that is already in use. 
     Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); 
     Client.Bind(new IPEndPoint(IPAddress.Any, ipEndPoint.Port));
     JoinMulticastGroup(ipEndPoint.Address); 
   }
}

In rete ho poi trovato qlcosa di simile, http://www.oreillynet.com/cs/user/view/cs_msg/44118

Per quanto riguarda l'esempio di utilizzo rimando alla prossima parte dell'articolo :-p

«aprile»
domlunmarmergiovensab
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567