Hoi allemaal,
Ik ben bezig met een P2P applicatie in .NET. In eerste instantie heb ik WCF gebruikt omdat WCF de PeerChannel ondersteund om P2P applicaties te gebruiken. Op een LAN netwerk werkt het netwerk perfect zonder problemen. Het probleem komt naar voren als ik verbinding wil maken tussen 2 peers over internet. Omdat de peers achter een NAT zijn kunnen ze niet direct met elkaar communiceren. Skype gebruikt de zogenaamde 'hole punching' methode om een verbinding tussen 2 peers tot stand te brengen tijdens het bellen.
WCF werkt helaas niet naar behoren. Het heeft Teredo nodig om communicatie tot stand te brengen via IPv6, maar Teredo wordt niet goed ondersteund en werkt niet goed op XP systemen.
Op internet kwam ik een aantal onderwerpen tegen die als hulpmiddel gebruikt kunnen worden om hole punching uit te voeren. STUN en STUNT/TURN zijn protocolen ontwikkeld voor dit. Ook UPnP wordt hier genoemd. De idee is om eerst een poort in de NAT te openen voor de applicatie voordat deze gebruikt gaat worden voor communicatie.
Op CodeProject heb ik het volgende project gevonden en toegepast: http://www.codeproject.com/KB/cs/STUN_client.aspx
Let op: De standaard stunserver.org host werkt niet meer, gebruik stun01.sipphone.com op poort 3478
Ik heb voor de test STUN toegepast en heb uiteindelijk mijn IP adres ontvangen met de bijbehorende geopende poort. De STUN server waarmee ik de verbinding maak hiervoor geeft mij het resultaat terug als:
Achter deze poort is geen UDP listener, dus ik kan nog geen data ontvangen. Hoe zorg ik ervoor nu dat ik een listener maak die de geopende poort meteen gaat gebruiken? De UDP socket in het project boven wordt gebruikt om de IP en Poort te achterhalen en wordt niet afgesloten.
Nadeel van STUN is dat het niet binnen elk netwerk wordt ondersteunt. Als UDP uit staat in de router, dan werkt dit allemaal niet. Skype werkt achter alle soorten firewalls zonder problemen. Ik denk dat Skype een combinatie gebruikt van STUN, STUNT/TURN, UPnP of meer...
Op CodePlex is ook een STUNT (voor TCP) versie van het hierboven genoemde, SharpSTUNT (http://sharpstunt.codeplex.com). Dit project is nog in ontwikkeling en werkt nog niet goed.
Op internet kon ik geen .NET library (dll) of source code vinden waar alles in 1 is toegepast. Weet iemand een alternatief? De bedoeling is dus om 2 peers die achter een NAT zijn te laten communiceren met elkaar. Liefst via TCP, maar UDP mag ook... Een C/JAVA/Python poort naar .NET kan ook.
Alvast heel erg bedankt voor de hulp,
Sead
Ik ben bezig met een P2P applicatie in .NET. In eerste instantie heb ik WCF gebruikt omdat WCF de PeerChannel ondersteund om P2P applicaties te gebruiken. Op een LAN netwerk werkt het netwerk perfect zonder problemen. Het probleem komt naar voren als ik verbinding wil maken tussen 2 peers over internet. Omdat de peers achter een NAT zijn kunnen ze niet direct met elkaar communiceren. Skype gebruikt de zogenaamde 'hole punching' methode om een verbinding tussen 2 peers tot stand te brengen tijdens het bellen.
WCF werkt helaas niet naar behoren. Het heeft Teredo nodig om communicatie tot stand te brengen via IPv6, maar Teredo wordt niet goed ondersteund en werkt niet goed op XP systemen.
Op internet kwam ik een aantal onderwerpen tegen die als hulpmiddel gebruikt kunnen worden om hole punching uit te voeren. STUN en STUNT/TURN zijn protocolen ontwikkeld voor dit. Ook UPnP wordt hier genoemd. De idee is om eerst een poort in de NAT te openen voor de applicatie voordat deze gebruikt gaat worden voor communicatie.
Op CodeProject heb ik het volgende project gevonden en toegepast: http://www.codeproject.com/KB/cs/STUN_client.aspx
Let op: De standaard stunserver.org host werkt niet meer, gebruik stun01.sipphone.com op poort 3478
Ik heb voor de test STUN toegepast en heb uiteindelijk mijn IP adres ontvangen met de bijbehorende geopende poort. De STUN server waarmee ik de verbinding maak hiervoor geeft mij het resultaat terug als:
code:
1
| Public binding: <mijn publieke ip adres>:<poort> |
Achter deze poort is geen UDP listener, dus ik kan nog geen data ontvangen. Hoe zorg ik ervoor nu dat ik een listener maak die de geopende poort meteen gaat gebruiken? De UDP socket in het project boven wordt gebruikt om de IP en Poort te achterhalen en wordt niet afgesloten.
Nadeel van STUN is dat het niet binnen elk netwerk wordt ondersteunt. Als UDP uit staat in de router, dan werkt dit allemaal niet. Skype werkt achter alle soorten firewalls zonder problemen. Ik denk dat Skype een combinatie gebruikt van STUN, STUNT/TURN, UPnP of meer...
Op CodePlex is ook een STUNT (voor TCP) versie van het hierboven genoemde, SharpSTUNT (http://sharpstunt.codeplex.com). Dit project is nog in ontwikkeling en werkt nog niet goed.
Op internet kon ik geen .NET library (dll) of source code vinden waar alles in 1 is toegepast. Weet iemand een alternatief? De bedoeling is dus om 2 peers die achter een NAT zijn te laten communiceren met elkaar. Liefst via TCP, maar UDP mag ook... Een C/JAVA/Python poort naar .NET kan ook.
Alvast heel erg bedankt voor de hulp,
Sead