J'utilise Qt pour mes communications TCP. Si mon PC possède 2 interfaces réseau (disons eth0, eth1), et si je veux utiliser explicitement eth1, comment puis-je le faire dans Qt ?
Réponses
Trop de publicités?QTcpServer::listen prend l'adresse de l'interface que vous voulez écouter comme premier argument.
Si vous avez l'adresse IP 192.168.0.1 sur eth0 et 10.0.0.1 sur eth1 alors
QTcpServer serv0;
QTcpServer serv1;
serv0.listen( QHostAddress("192.168.0.1"), 8080 );
serv1.listen( QHostAddress("10.0.0.1"), 8080 );
serv0 écoutera uniquement le port 8080 sur eth0 et serv1 écoutera uniquement le port 8080 sur eth1.
Il n'y a aucun moyen de spécifier l'interface que QTcpSocket doit utiliser puisque c'est le système d'exploitation qui décide en fonction de la table de routage du noyau.
Vous pouvez utiliser QNetworkInterface::allAddresses() pour obtenir la liste des adresses d'interfaces disponibles.
Il ne semble pas que l'API réseau de Qt prenne en charge la liaison aux interfaces pour les connexions TCP. Il existe un QUdpSocket::bind
mais apparemment pas de fonction correspondante pour QTcpSocket
objets.
Si Qt ne vous donne pas le contrôle dont vous avez besoin, vous devrez peut-être vous rabattre sur les fonctions de socket du niveau OS. Heureusement, l'API Berkeley Socket est essentiellement multiplateforme et ne présente que des différences mineures entre les systèmes d'exploitation.