Click here to Skip to main content
Click here to Skip to main content

STUN Client

By , 20 Apr 2007
 
Screenshot - stun.jpg

Introduction

STUN - Simple Traversal of User Datagram Protocol (UDP) through Network Address Translators (NATs). In few words, it just helps you to map your local computer IP:port to public IP:port.

STUN working idea is pretty simple. The client just sends a UDP packet out to the STUN server and the server answers back with IP:port you connected. STUN does three tests to detect the NAT type.

In test I, the client sends a STUN Binding Request to a server, 
without any flags set in the CHANGE-REQUEST attribute, 
and without the RESPONSE-ADDRESS attribute. This causes the server 
to send the response back to the address and port that the request came from.
           
In test II, the client sends a Binding Request with both the 
"change IP" and "change port" flags from the CHANGE-REQUEST attribute set.  
              
In test III, the client sends a Binding Request with only the "change port" flag set.
                          
                                    +--------+
                                    |  Test  |
                                    |   I    |
                                    +--------+
                                         |
                                         |
                                         V
                                        /\              /\
                                     N /  \ Y          /  \ Y             +--------+
                      UDP     <-------/Resp\--------->/ IP \------------->|  Test  |
                      Blocked         \ ?  /          \Same/              |   II   |
                                       \  /            \? /               +--------+
                                        \/              \/                    |
                                                         | N                  |
                                                         |                    V
                                                         V                    /\
                                                     +--------+  Sym.      N /  \
                                                     |  Test  |  UDP    <---/Resp\
                                                     |   II   |  Firewall   \ ?  /
                                                     +--------+              \  /
                                                         |                    \/
                                                         V                     |Y
                              /\                         /\                    |
               Symmetric  N  /  \       +--------+   N  /  \                   V
                  NAT  <--- / IP \<-----|  Test  |<--- /Resp\               Open
                            \Same/      |   I    |     \ ?  /               Internet
                             \? /       +--------+      \  /
                              \/                         \/
                              |                           |Y
                              |                           |
                              |                           V
                              |                           Full
                              |                           Cone
                              V              /\
                          +--------+        /  \ Y
                          |  Test  |------>/Resp\---->Restricted
                          |   III  |       \ ?  /
                          +--------+        \  /
                                             \/
                                              |N
                                              |       Port
                                              +------>Restricted

/// <summary>
/// UDP is always blocked.
/// </summary>
UdpBlocked,

/// <summary>
/// No NAT, public IP, no firewall.
/// </summary>
OpenInternet,

/// <summary>
/// No NAT, public IP, but symmetric UDP firewall.
/// </summary>
SymmetricUdpFirewall,

/// <summary>
/// A full cone NAT is one where all requests from the same internal 
/// IP address and port are mapped to the same external IP address and port.
/// Furthermore, any external host can send a packet to the internal host, 
/// by sending a packet to the mapped external address.
/// </summary>
FullCone,

/// <summary>
/// A restricted cone NAT is one where all requests from the same
/// internal IP address and port are mapped to the same external IP address and port.
///  Unlike a full cone NAT, an external host (with IP address X) 
/// can send a packet to the internal host only if the internal host 
/// had previously sent a packet to IP address X.
/// </summary>
RestrictedCone,

/// <summary>
/// A port restricted cone NAT is like a restricted cone NAT, but the restriction 
/// includes port numbers. Specifically, an external host can send a packet, 
/// with source IP address X and source port P, to the internal host only if 
/// the internal host had previously sent a packet to IP address X and port P.
/// </summary>
PortRestrictedCone,

/// <summary>
/// A symmetric NAT is one where all requests 
/// from the same internal IP address and port, 
/// to a specific destination IP address and port, are mapped to the same external 
/// IP address and port.  If the same host sends a packet with the same source address 
/// and port, but to a different destination, a different mapping is used. 
/// Furthermore, only the external host that
/// receives a packet can send a UDP packet back to the internal host.
/// </summary>
Symmetric

Using the Code

// Create new socket for STUN client.
Socket socket = new Socket
    (AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
socket.Bind(new IPEndPoint(IPAddress.Any,0));

// Query STUN server
STUN_Result result = STUN_Client.Query("stunserver.org",3478,socket);
if(result.NetType != STUN_NetType.UdpBlocked){
    // UDP blocked or !!!! bad STUN server
}
else{
    IPEndPoint publicEP = result.PublicEndPoint;
    // Do your stuff
}

History

  • 20.04.2007 - Initial version

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Ivar Lumi
Estonia Estonia
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralRe: WCF interop STUNmemberIvar Lumi19 Mar '09 - 4:29 
Hi,
 
It should run on CF or then need only minmal changes.
GeneralRe: WCF interop STUNmemberngocdonghack200119 Mar '09 - 15:00 
Thanks for quick ans!
 
Could you please explain more about this and how to use it with WCF?
I've looked for this solution in a long time and really need this!
GeneralRe: WCF interop STUNmemberIvar Lumi19 Mar '09 - 20:36 
If you just need stun, it probably wiser to compile to new dll.
 
I dont see what your problems using in CF, odes it use some method what isnt supported in CF ?
GeneralRe: WCF interop STUNmemberngocdonghack200120 Mar '09 - 5:46 
My problems is that when i've got a global & local mapped address and the next step is to open a communication channel, but i don't know how to do it! Could you please give me a simple example of message transfer between node through STUN?
GeneralRe: WCF interop STUNmvpUwe Keim17 Apr '10 - 7:47 
"WCF" stands for "Windows Communication Foundation[^]"
"CF" stands for ".NET Compact Framework[^]"
 
Are you sure you and the original poster of the question talk about the same thing? Smile | :)
My personal 24/7 webcam
Free Test case management - Intuitive, competitive, Test Plans. Download now!
Free homepage builder - Intuitive, very easy to use. Download now!

GeneralRe: WCF interop STUNmembercwienands8 Oct '10 - 5:26 
Check out my answer under 'How i connect to remote machine using Stun'. You'll have to figure out how to use UDP under WCF and use the hole punching technique to make it work. STUN only helps you to find out the necessary info, public IP and port, to do hole punching. You'll also need an additional rendezvous server.
 
Christoph
QuestionCan someone post Windows XP executable of STUN Client?membersomi123426 Nov '08 - 10:52 
I was unable to build the release configuration on Windows XP machine. Can someone post Windows XP executable of STUN Client?
Generaldifferent results on different serversmemberprince prince16 Jul '08 - 13:52 
Hi,
I tried testing your code with the folowing servers:
stun.xten.net it gives me RestrictedCone while it should give FullCone.
stunserver.org give me FullCone
jstun.javawi.de it gives udpblocked
 
how can I know assure it is working properly? normally it gives me
GeneralRe: different results on different serversmemberIvar Lumi17 Jul '08 - 6:45 
Hi,
 
It only can depend on server answers, because STUN packets should be always same.
GeneralRe: different results on different serversmemberprince prince21 Jul '08 - 3:46 
I tried testing with JSTUN client, it gives the expected result in terms of response FullCone, RestrictedCone.. But it does not give the IP address and the mapped port. May be there is problem with the flow of the algorithm implemented in your client?
GeneralRe: different results on different serversmemberIvar Lumi21 Jul '08 - 7:31 
Does jstun gives different results for same LAN with diferent stun servers ?
GeneralSTUN client on WM5memberprince prince27 Jun '08 - 0:25 
Hi,
would this project work fine if I try to recompile for compact framework ?if not what modifications do I need. I understand that the forms are not the same since WM5 is based on WinCE but would the client work fine?
GeneralRe: STUN client on WM5memberIvar Lumi27 Jun '08 - 4:14 
Hi,
 
STUN client must work, at first look it doesnt uses classes what CF wont support.
GeneralAny server help create tunnel between 2 peer behind NATmemberhoanglinh94668 Jun '08 - 23:32 
The NAT server only let us know about our server-side ip and port. But when each peer know its server-side ip and port, they need to send that information to each other, right ? And they cannot send directly to each other, so do u know any server do that (we can connect to that server, send our information, and server send that information to the other peer...) ?
 
Thank you very much !
GeneralFirewall is not blocking UDP but Stun Client demo program shows UDP is blockedmemberSrein5 Jun '08 - 13:47 
I have STUN server and running the stun client demo program from outside the firewall. I get the NAT type as UdpBlocked but I have Wireshark running on the firewall machine and it shows UDP is transmitted. What do you think the problem? Thanks for the excellent program
GeneralRe: Firewall is not blocking UDP but Stun Client demo program shows UDP is blockedmemberIvar Lumi5 Jun '08 - 19:34 
Transmited won't mean not blocked, like response packet never reaches, so firewall wont allow resonses back from server.
GeneralI want to make a file transfer program !! Help mememberhoanglinh94664 Jun '08 - 21:30 
I want to make a file transfer program using STUN to pass through NAT, but I think UDP protocol isn't suitable for this, right ? And I can't find any STUN for TCP. So do you have any suggestion for me ? Do I have to build a protcol like TCP based on UDP ???
 
Thanks.
GeneralRe: I want to make a file transfer program !! Help mememberIvar Lumi5 Jun '08 - 4:47 
TCP cant be used behind NAT ....
 
You must use UDP. The only way it packetize file in to UDP chunks and add checksum for each chunk. SO you only need to make some logixc what keeps track what chucks not reaced ant retransmit them. md5 chek sum quarrantees that chunk data not corrupt.
QuestionCan it make port mapping with STUN ?memberBigbermusa30 May '08 - 4:21 
Hi,
 
I want to transfer audio and text to the clients over the internet,with STUN can it make this for me to do port mapping behind a LAN between two machines ?
 
Thank you.
 
Bigbermusa
AnswerRe: Can it make port mapping with STUN ?memberIvar Lumi30 May '08 - 5:24 
Hi,
 
Yes, thats the main usage of STUN.
GeneralRe: Can it make port mapping with STUN ?memberBigbermusa30 May '08 - 6:13 
OK,thanks.
Can it also support for sending/receiving video packet ?
How long that stunserver will be site situation on the net ?
 
Thanks,
Bermusa
GeneralRe: Can it make port mapping with STUN ?memberIvar Lumi30 May '08 - 7:14 
>Can it also support for sending/receiving video packet ?
Seems you have get wrong idea about stun. stun is just for discovering pubic ip and port of NAT behind IP endpoint.
Most common video transport is RTP.
 
>How long that stunserver will be site situation on the net ?
I think if you reread your question, then even you dont get what you mean by this.
GeneralRe: Can it make port mapping with STUN ?memberBigbermusa30 May '08 - 7:29 
Ivar Lumi wrote:
>Can it also support for sending/receiving video packet ?
Seems you have get wrong idea about stun. stun is just for discovering pubic ip and port of NAT behind IP endpoint.
Most common video transport is RTP.

 
OK,i see,but let me ask you that if port of NAT is discovered and mapped by stun,can i use it to transport video stream over the internet ?
If i'm wrong understanding,please suggest.
 
Thanks,
Bigbermusa
GeneralRe: Can it make port mapping with STUN ?memberIvar Lumi30 May '08 - 7:39 
Theoretically you can when both computers start sending data each other. Otherwise NAT won't pe opened !!!
Normally some kind of signalling protocol is used to setup session. For example voip phones use SIP + SDP for that.
GeneralRe: Can it make port mapping with STUN ?memberBigbermusa30 May '08 - 8:09 
That's mean only port mapping by stun but NAT won't be opened to point correctly,like you said.
Is it right ?

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 20 Apr 2007
Article Copyright 2007 by Ivar Lumi
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid