Hello,
Dans mon framework python pour bus KNX, qui repose sur une transmission
multicast des données, j'initialise mon socket de réception de la façon
suivante :
class MCastRecv(socket):
def __init__(self, localAddr, localPort, mcastAddr, mcastPort):
super(MCastRecv, self).__init__(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
self.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
#self.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
self.setsockopt(SOL_IP, IP_MULTICAST_TTL, 32)
self.setsockopt(SOL_IP, IP_MULTICAST_LOOP, 1)
self._sock.bind(("", localPort))
self.setsockopt(SOL_IP, IP_MULTICAST_IF, inet_aton(localAddr))
self.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP,
inet_aton(mcastAddr) + inet_aton(localAddr))
self.settimeout(1)
Quelqu'un m'a proposé un patch ; il s'agit de remplacer :
self.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP,
inet_aton(mcastAddr) + inet_aton(localAddr))
par :
value = struct.pack("=4sl", inet_aton(mcastAddr), INADDR_ANY)
self.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, value)
avec cette explication :
"It makes the client subscribe to the multicast address. This is
important in a scenario with multicast-aware switches/routers. If you
don't subscribe to a multicast address, a multicast-aware switch/router
will not forward the multicast messages to you. If you are working with
"cheap/non-multicast-aware" switches this doesn't matter since the
switch will treat all multicasts als broadcasts."
J'avoue ne pas bien piger la subtilité qu'il y a entre les 2 formes...
Si quelqu'un a plus d'infos, je suis preneur !
Merci d'avance.
--
Frédéric