réception Multicast et portabilité
Bonjour à tous,
Je me tourne vers vous pour essayer de trouver des développeurs qui auraient eu (et résolu ?) le problème qui se pose à moi.
Je dois écrire un bout de code capable de recevoir des trames UDP en multicast. Pour info (je ne le savais pas ce matin), le multicast est entre l'unicast et le broadcast : une trame est envoyée à une adresse ip unique de classe D (224.0.0.0 à 239.255.255.255), et plusieurs clients abonnés à ce groupe reçoivent cette trame.
En C++ avec Qt, pour envoyer la trame, un petit coup de QUdpSocket avec une écriture sur l'adresse et le port, et le tour est joué...
Code:
1 2 3 4 5 6 7
|
QUdpSocket * udp;
QHostAddress adr;
adr = "239.255.255.250";
qint16 port = 1900;
QByteArray datagram = "NOTIFY * HTTP/1.1\r\n[...]";
udp->writeDatagram(datagram.data(), adr, port); |
Pour ceux qui auraient reconnu, c'est un message SSDP, utilisé dans la phase 1 (découverte) du protocole UPNP.
Maintenant il faut que je code l'autre coté, la réception du message, et c'est là que ça se complique. La logique simple aurait voulu qu'un code dans ce style fonctionne :
Code:
1 2 3
| udpSocket = new QUdpSocket(this);
QHostAddress multicastAddr("239.255.255.250");
udpSocket->bind(multicastAddr, 1900, QUdpSocket::ShareAddress); //Renvoi false :( |
Mais si c'était le cas je ne serais pas ici :)
Plusieurs personnes se sont déjà posées la même question, il y a des pistes sur Internet :
Malheureusement, la classe QSocketDevice est dépréciée depuis Qt4. Les informations de migrations de Qt3 vers Qt4 pour QSocketDevice ne me permettent pas d'y voir plus clair sur une méthode fonctionelle. J'ai trouvé aussi des infos à propos de ACE, une librairie multiplateforme permettant de mettre en place entre autre l'écoute multicast. Je n'ai pas encore regardé de ce coté, sachant que mon code devra IMPERATIVEMENT tourner sur Windows Mobile, et dans le meilleur des cas sur toutes les plateformes supportées par Qt.
Et comme le bug signalé sur le Bugreport Qt est toujours ouvert et ne semble pas inquiéter grand monde, je désespère de trouver des gens qui auraient rencontré le même cas plus ou moins récemment pour discuter avec eux de leurs éventuelles solutions.
Cordialement,
Antoine