Ok, I was wrong in my approach of the problem. I had to use the MulticastInterface to solve my trouble: for UDP processing, QHostAddress::AnyIPv4 only to bind.
The correct code is (maybe for the next one...) : QUdpSocket* socket = new QUdpSocket(this); // Use a regular expression to parse the adress QRegularExpression re( "^(\\d+.\\d+.\\d+.\\d+):(\\d+)$"); QRegularExpressionMatch match = re.match(address); if ( !match.hasMatch() ) { qb::warn( QString("Invalid address %1").arg(address) ); return 0; } // Bind to the port int port = match.captured(2).toInt(); if (!socket->bind( QHostAddress::AnyIPv4 , port, QAbstractSocket::ShareAddress | QAbstractSocket::ReuseAddressHint )) { qb::warn( QString("Not possible to bind to %1:%2 : %3").arg(_bindAddress).arg(port).arg(socket->errorString()) ); return 0; } else { qb::inform( QString("Local address: %1, Local port: %2.").arg(socket->localAddress().toString()).arg(socket->localPort()) ); } // Join the multicast group QString ipAddress = match.captured(1); if (!socket->joinMulticastGroup( QHostAddress(ipAddress) )) { qb::warn( QString("Cannot join %1 : %2").arg(ipAddress).arg(socket->errorString()) ); return 0; } // Get the bind address if ( _bindAddress.isEmpty() ) { qb::inform("No binding activated. Choose default network interface."); } else { QHostAddress bindAddress( _bindAddress ); qb::inform("Bind address: " + bindAddress.toString()); QList<QNetworkInterface> interfaceList = QNetworkInterface::allInterfaces(); bool done = false; foreach( const QNetworkInterface& iface, interfaceList ) { if ( iface.allAddresses().contains( bindAddress) ) { qb::inform( QString( "%1 interface selected." ).arg( bindAddress.toString() )); socket->setMulticastInterface( iface ); done = true; break; } } if (!done) { qb::warn("Binding failed, check your network settings."); } } // IMPORTANT : set the maximum receive buffer size // Allow to reach high throughput (4Mb/s) without too many lost packets // Default value does not seem to be good enough setsockopt(socket->socketDescriptor(), SOL_SOCKET, SO_RCVBUF, (const char*) &_socketBufferSize, sizeof(int)); qb::inform( QString("Start listening to %1:%2").arg(ipAddress).arg(port) ); connect(socket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams())); connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onSocketError(QAbstractSocket::SocketError))); 2014-10-31 22:07 GMT+01:00 Thiago Macieira <thiago.macie...@intel.com>: > On Thursday 30 October 2014 15:43:23 Jean-Nicolas Artaud wrote: > > I've got a trouble I don't understand : the bind on the QUdpSocket > doesn't > > conplains but I don't receive anything if I put my IP Address in > > _bindAddress. So the binding on AnyIPv4 works but not for adresses. > > > > (the soft I'm working on is multi OS (Linux/Windows) I develop and test > on > > Linux and I can answer your questions as fast as possible, and even try > > your suggestions). > > Run strace on your application and tell us what system calls it made to > that > address. We're looking for a socket(2) call, a bind(2) call and a > setsockopt(2) call. > > -- > Thiago Macieira - thiago.macieira (AT) intel.com > Software Architect - Intel Open Source Technology Center > > _______________________________________________ > Interest mailing list > Interest@qt-project.org > http://lists.qt-project.org/mailman/listinfo/interest > -- Jean-Nicolas
_______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest