Ich konvertiere meine IPv4 -Netzwerkbibliothek in die Unterstützung von IPv6. Ich verwende es, um die UDP -Kommunikation zwischen Geräten auf demselben LAN zu initiieren. Eines der Geräte (IPv4) A "Connect" -Paket (wie in meinem Protokoll definiert), das von einem Hörgerät gelesen wird. Alle funktionieren in IPv4 gut. Wir müssen aber auch angeben, welche Schnittstelle in der Funktion "sendTo () verwendet werden soll. Ich verwende die Funktion getIfaddrs () , um die Liste der verfügbaren Schnittstellen abzufragen. Ich filtere diejenigen, die IPv6 oder Multicast nicht unterstützen, und stelle sicher, dass sie abgelaufen sind. Das lässt mich jedoch immer noch mit einer Liste von ungefähr 6 benannten Schnittstellen mit unterschiedlichen Indizes auf meinem iPhone -Testgerät (
, en2 , anpi0 , awdl0 , llw0 ). Ich versuche, Pakete mit jeder Schnittstelle zu senden. Die Funktion "sendTo () behauptet, die Pakete für alle Schnittstellen gesendet zu haben, aber mit Wireshark kann ich sehen, dass nur eines von ihnen - der eine mit dem Namen en0 - tatsächlich die Pakete um mein lokales Netzwerk sendet. Und woher weiß ich, ob ein Paket tatsächlich erfolgreich multicast war? Um die Liste der Schnittstellen zu erhalten: < /p>
Code: Select all
ifaddrs* pFirstIf = nullptr;
if( getifaddrs( &pFirstIf ) == 0 )
{
for( ifaddrs* pIf = pFirstIf; pIf != nullptr; pIf = pIf->ifa_next )
{
const uint32 ifFlags = pIf->ifa_flags;
// Ignore loopback
if( ifFlags & IFF_LOOPBACK )
continue;
// Ensure up and supports multicast
if( ((ifFlags & IFF_UP) == 0) || ((ifFlags & IFF_MULTICAST) == 0) )
continue;
// Check an IP6 family interface
if( pIf->ifa_addr->sa_family != AF_INET6 )
continue;
// Get the interface index
const int ifIndex = if_nametoindex( pIf->ifa_name );
// The address scope id is usually the same as the interface index (or 0 if not)
const sockaddr_in6* pAddr6 = (sockaddr_in6*)pIf->ifa_addr;
// This appears to be a viable interface to use for multicast - or is it? How can we tell?
LOG( "Interface: " ifa_name