Click here to Skip to main content
15,860,861 members
Articles / Programming Languages / C#
Article

STUN Client

Rate me:
Please Sign up or sign in to vote.
4.83/5 (36 votes)
20 Apr 2007CPOL 319.1K   14.8K   85   88
STUN client C# implementation with sample application
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

C#
// 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)


Written By
Estonia Estonia
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Questionhow it use? Pin
Ilos Sharamis2-Jul-23 9:40
Ilos Sharamis2-Jul-23 9:40 
QuestionGood job Pin
ulixxes3-Dec-17 9:23
ulixxes3-Dec-17 9:23 
GeneralAnother thank you Pin
Glenn Rockland29-Apr-17 16:33
Glenn Rockland29-Apr-17 16:33 
GeneralThank you Pin
S.N.Jayaraman23-Sep-14 3:01
S.N.Jayaraman23-Sep-14 3:01 
QuestionRetransmission is too fast Pin
Ron Deijkers28-Nov-13 4:37
Ron Deijkers28-Nov-13 4:37 
AnswerRe: Retransmission is too fast Pin
Ivar Lumi28-Nov-13 6:31
Ivar Lumi28-Nov-13 6:31 
Questionserver issues Pin
Jacob Humphrey8-Dec-12 10:38
Jacob Humphrey8-Dec-12 10:38 
AnswerRe: server issues Pin
Ivar Lumi9-Dec-12 20:14
Ivar Lumi9-Dec-12 20:14 
Questioni want this coding in ios can u provide source code for this or c/C++ library Pin
Member 847073623-Jan-12 1:57
Member 847073623-Jan-12 1:57 
AnswerRe: i want this coding in ios can u provide source code for this or c/C++ library Pin
Ivar Lumi23-Jan-12 2:00
Ivar Lumi23-Jan-12 2:00 
GeneralThanks for the article and source code Pin
cwienands8-Oct-10 5:32
cwienands8-Oct-10 5:32 
QuestionHow i connect to remote machine using Stun Pin
srdusad16-Apr-10 19:49
srdusad16-Apr-10 19:49 
AnswerRe: How i connect to remote machine using Stun Pin
Ivar Lumi17-Apr-10 19:24
Ivar Lumi17-Apr-10 19:24 
AnswerRe: How i connect to remote machine using Stun Pin
lok.vikram26-Aug-10 1:32
lok.vikram26-Aug-10 1:32 
GeneralRe: How i connect to remote machine using Stun Pin
Ivar Lumi26-Aug-10 20:16
Ivar Lumi26-Aug-10 20:16 
AnswerRe: How i connect to remote machine using Stun Pin
cwienands8-Oct-10 5:23
cwienands8-Oct-10 5:23 
GeneralRe: How i connect to remote machine using Stun Pin
Ivar Lumi9-Oct-10 3:25
Ivar Lumi9-Oct-10 3:25 
QuestionISP internet connection failes after runing the client Pin
zugan27-May-09 7:33
zugan27-May-09 7:33 
AnswerRe: ISP internet connection failes after runing the client Pin
Ivar Lumi27-May-09 8:58
Ivar Lumi27-May-09 8:58 
GeneralWCF interop STUN Pin
ngocdonghack200119-Mar-09 4:10
ngocdonghack200119-Mar-09 4:10 
GeneralRe: WCF interop STUN Pin
Ivar Lumi19-Mar-09 4:29
Ivar Lumi19-Mar-09 4:29 
GeneralRe: WCF interop STUN Pin
ngocdonghack200119-Mar-09 15:00
ngocdonghack200119-Mar-09 15:00 
GeneralRe: WCF interop STUN Pin
Ivar Lumi19-Mar-09 20:36
Ivar 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 STUN Pin
ngocdonghack200120-Mar-09 5:46
ngocdonghack200120-Mar-09 5:46 
GeneralRe: WCF interop STUN Pin
Uwe Keim17-Apr-10 7:47
sitebuilderUwe Keim17-Apr-10 7:47 

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.