[Interest] QUdpSocket, QNetworkDatagram and QNetworkInterface

Nuno Santos nunosantos at imaginando.pt
Wed Oct 30 08:13:02 CET 2019


Thanks so much for this super detailed and informative reply. All my questions are clarified now.

Thank you!

Best regards,


> On 29 Oct 2019, at 22:06, Thiago Macieira <thiago.macieira at intel.com> wrote:
> On Tuesday, 29 October 2019 12:12:37 PDT Nuno Santos wrote:
>> Hi,
>> I’m trying to understand how does Qt decides which QNetworkInterface will be
>> used when a writeDatagram is called.
> The one you passed. Otherwise, it doesn't decide.
>> I’m currently on a system that has both cable and wifi connections
>> available, however, when doing a QUdpSocket writeDatagram the packets are
>> being sent from the wifi adaptor, at least this is what I can infer from
>> the IP address that comes on the packet when it arrives the other machine.
>> What puzzles me is that supposedly, a cable connection is faster than a
>> wifi connection.
> You cannot infer which interface a packet was sent on from the IP address it 
> included in the sender. It's entirely possible to use one interface's IP 
> address while sending on another.
>> While investigating the Qt documentation, it seems that I can use the
>> writeDatagram function of QUdpSocket and specify on the QNetworkDatagram
>> which interface I want to use by using the setInterfaceIndex function.
> Or by specifying the interface index in the QNetworkDatagram at the moment of 
> sending it. This allows you to send each datagram on a different interface, if 
> you so choose.
>> Is there anyway of knowing which network interface will be used by a
>> QUdpSocket when transmitting data via writeDatagram? Or should I explicitly
>> setInterfaceIndex on QNetworkDatagram and use the writeDatagram
>> QNetworkDatagram variant function in order to have full control?
> If you set the interface, it's the one you set.
> If you didn't, then I'll argue that you shouldn't need to know. If you didn't 
> need to set the interface, that means you don't care which interface gets 
> used. The OS will consult the routing tables (there can be more than one!) and 
> will decide how to send. It's a mix of shortest address matches and the 
> route's metrics. It's supposed to have been properly configured for best 
> performance.
> For example, on my system:
> $ ip route
> default via dev enxf8cab86aba42 proto dhcp metric 20100 
> default via dev wlp58s0 proto dhcp metric 20600 
> dev wlp58s0 proto kernel scope link src metric 600 
> dev enxf8cab86aba42 proto kernel scope link src 
> metric 100 
> dev vboxnet0 proto kernel scope link src 
> linkdown 
> The two direct routes (via broadcast) have metrics between 100 and 1000, so 
> the system will use those for sending whenever possible. the default routes 
> have 20000 + the interface's own metric, so the kernel will choose to use the 
> wired interface in preference over the wireless.
> This of course depends on how your system was set up. If the metrics aren't 
> what you wanted, please consult your network manager daemon's documentation.
> You can also confirm by using the "ip route get" command:
> $ ip route get
> via dev enxf8cab86aba42 src uid 1000 
>    cache 
> $ ip route get
> dev wlp58s0 src uid 1000 
>    cache 
> $ ip route get
> dev enxf8cab86aba42 src uid 1000 
>    cache 
> -- 
> Thiago Macieira - thiago.macieira (AT) intel.com
>  Software Architect - Intel System Software Products

More information about the Interest mailing list