6 votes

Comment choisir l'interface réseau à utiliser ?

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 ?

7voto

VestniK Points 866

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.

2voto

Greg Hewgill Points 356191

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.

1voto

Andrew McGregor Points 7641

Ce n'est pas une question de Qt, c'est une question de socket. Bind() à l'adresse de eth1. Vous devez espérer que la table de routage fera ce que vous attendez lorsque vous faites cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X