Frage

arbeite ich derzeit an einer UDP Socket-Anwendung und ich brauche Unterstützung zu bauen, so dass IPv4- und IPv6-Verbindungen Pakete an einen Server senden können.

Ich hatte gehofft, dass mir jemand helfen könnte und zeigen Sie mir in die richtige Richtung; die Mehrheit der Dokumentation, die ich war nicht vollständig gefunden. Es wäre auch hilfreich, wenn Sie Unterschiede zwischen Winsock und BSD-Sockets hinweisen könnten.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Der beste Ansatz ist einen IPv6-Server-Socket zu erstellen, die IPv4-Verbindungen auch annehmen kann. Dazu erstellen Sie einen regelmäßigen IPv6-Buchse, schalen off die Socket-Option IPV6_V6ONLY, binden sie an die "jeder" Adresse und beginnen zu empfangen. IPv4-Adressen werden als IPv6-Adressen dargestellt werden, in dem IPv4-mapped Format.

Der wesentliche Unterschied zwischen Systemen ist, ob IPV6_V6ONLY a) zur Verfügung, und b) ein- oder ausgeschaltet ist standardmäßig aktiviert. Es wird standardmäßig auf Linux (das heißt so dass Dual-Stack-Steckdosen ohne setsockopt) und eingeschaltet ist auf den meisten anderen Systemen ausgeschaltet.

Darüber hinaus wird der IPv6-Stack unter Windows XP diese Option nicht unterstützen. In diesen Fällen müssen Sie zwei separate Server-Sockets erstellen, und legen Sie sie in ausgewählte oder in mehrere Threads.

Andere Tipps

Der Socket-API wird von IETF RFCs geregelt und soll gleich auf allen Plattformen einschließlich Windows WRT IPv6 sein.

Für IPv4 / IPv6-Anwendungen ist es ALL über getaddrinfo() und getnameinfo(). getaddrinfo ist ein Genie - schauen auf DNS, Port-Namen und Funktionen des Kunden zu lösen, die ewige Frage „kann ich verwenden IPv4, IPv6 oder beide ein bestimmtes Ziel zu erreichen?“ Oder, wenn Sie gehen zu der Dual-Stack-Route und wollen sie IPv6 IPv4-Mapped-Adressen zurückkehren, wird es das auch tun.

Er stellt eine direkte sockaddr * Struktur, die in bind() eingesteckt werden kann, recvfrom(), sendto() und die Adressfamilie für socket() ... In vielen Fällen sind dies keine chaotisch sockaddr_in(6) Strukturen bedeutet auszufüllen und zu behandeln.

Für UDP-Implementierungen wäre ich vorsichtig über die Einstellung Dual-Stack-Buchsen oder, allgemeiner, die Bindung an allen Schnittstellen (INADDR_ANY). Das klassische Problem ist, dass, wenn die Adressen nicht (siehe bind()) auf bestimmte Schnittstellen gesperrt und das System verfügt über mehrere Schnittstellen-Anforderungen, können Antworten Transit von verschiedenen Adressen für Computer mit mehreren Adressen auf den Launen der OS-Routing-Tabelle basierten, verwirrende Anwendung Protokolle-insbesondere alle Systeme mit Authentifizierungsanforderungen.

Für UDP Implementierungen, bei denen dies kein Problem ist, oder TCP, Dual-Stack-Sockets kann viel Zeit sparen, wenn IPv * Ihr System, Aktivieren. Man muss vorsichtig sein, um nicht ganz auf Dual-Stack zu verlassen, wo es ist nicht unbedingt notwendig, da es kein Mangel an angemessenen Plattformen (Alt Linux, BSD, Windows 2003) im Einsatz mit IPv6-Stacks nicht in der Lage Dual-Stack-Buchsen.

Ich habe mit diesem unter Windows zu spielen und es scheint tatsächlich ein Sicherheitsproblem, dort zu sein, wenn Sie an der Loopback-Adresse binden dann wird der IPv6-Socket richtig gebunden [:: 1], aber der abgebildete IPv4-Socket ist gebunden INADDR_ANY, so dass Ihr (angeblich) sicher nur lokaler App der Welt tatsächlich ausgesetzt ist.

Die RFCs nicht wirklich geben Sie die Existenz der IPV6_V6ONLY Socket-Option, aber, wenn es nicht vorhanden ist, die RFCs ziemlich klar, dass die Umsetzung so sein sollte, obwohl diese Option FALSCH ist.

Wenn die Option vorhanden ist, würde ich argumentieren, dass es falsch Standard sollte, aber aus Gründen Verständnis vorbei, BSD und Windows-Standard-Implementierungen auf TRUE. Es ist eine bizarre Behauptung, dass dies ein Sicherheitsproblem, weil ein ahnungs IPv6 Programmierer binden könnte denken, sie für nur IPv6 nur IN6ADDR_ANY banden und versehentlich eine IPv4-Verbindung akzeptiert ein Sicherheitsproblem verursachen. Ich denke, dies ist sowohl weit hergeholt und absurd zusätzlich zu einer Überraschung für jeden eine RFC-konforme Implementierung erwartet.

Im Fall von Windows, nicht-compiance wird in der Regel keine Überraschung sein. Im Fall von BSD ist dies bestenfalls bedauerlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top