* NAT Traversal :PROPERTIES: :CUSTOM_ID: nat-traversal :END: P2PRC currently supports TURN for NAT traversal. ** TURN :PROPERTIES: :CUSTOM_ID: turn :END: The current TURN implementation used is FRP. The TURN server is also required when a P2PRC node is acting as a Server. The TURN server is determined based on the Node with the least amount of latency based on the Nodes available on the IPTable. Once a TURN server is determined there are 2 actions performed. The first one is =/FRPPort= to the TURN server to receive a port which is used to generate the external port from the TURN server. The flow below describes the workflow. *** Client mode :PROPERTIES: :CUSTOM_ID: client-mode :END: - Call =/FRPPort= #+begin_example http://:/FRPport #+end_example - Call the TURN server in the following manner. The following is a sample code snippet below. #+begin_src go import ( "github.com/Akilan1999/p2p-rendering-computation/p2p/frp" ) func main() { serverPort, err := frp.GetFRPServerPort("http://" + + ":" + lowestLatencyIpAddress.ServerPort) if err != nil { return nil, err } // Create 1 second delay to allow FRP server to start time.Sleep(1 * time.Second) // Starts FRP as a client with proxyPort, err := frp.StartFRPClientForServer(, serverPort, ) if err != nil { return nil, err } } #+end_src