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