Diarkis Inc.

Top > Blog > Peer-to-Peer Communication With Diarkis

Peer-to-Peer Communication With Diarkis

Diarkis allows you to implement P2P (peer-to-peer) between the client devices. The server cluster of Diarkis acts as both STUN servers and TURN servers in order for the client devices to communicate directly.

Because P2P allows devices to communicate directly, the latency is usually kept to be very minimum (You must be aware of physical distance between the client devices more, though). It is suitable for latency-sensitive applications. It also moves the workload from the servers to the client devices, so the server workload will be kept minimum while client devices’ stress may increase.

What Is Peer-to-Peer?

Peer-to-peer or P2P is a form of distributed network architecture. Instead of having a central server(s) to relay messages between devices, P2P allows the devices to send and receive messages directly.

In this article, we will focus only on the direct communications between devices as it is also the focus of Diarkis’ P2P. If you are interested in P2P networks and mesh networks, here is a relevant article on the topic.

P2P Basics – STUN Servers

STUN Servers stands for Session Traversal Utilities for NAT. It is a mouthful, I know. It basically means STUN servers serve as an intermediary discovery service for devices that wish to communicate directly.

Devices send a UDP packet to STUN servers and have the STUN servers discover their public addresses so that the devices may receive messages at these addresses. Usually, devices sit behind routers and the locally visible addresses and publically visible addresses are different. In order for devices to find their public addresses, they need STUN servers: STUN servers look at each UDP packet header from devices to discover the source address (NAT Traversal). If you wish to learn more details on STUN servers, this article might be a good one to read.

P2P Basics – TURN Servers

TURN stands for Traversal Using Relays around NAT. The technique used by STUN servers called NAT traversal may fail. It is affected heavily by the device’s network environment (routers etc.).

There are other causes for P2P communications to fail also. When deveices fail to communicate directly, they send messages to TURN servers to “relay” the messages to other devices, so that the devices may still exchange messages. More details on TURN servers maybe found here.

P2P Basics – Hole Punching

Once devices exchange each other’s public addresses through STUN servers, these devices must send packets to each other. Routers are usually configured to drop packets received from unknow sources. By sending packets to other devices, they will become “known” to the router and will be able to receive message packets from those “known” devices. This is called Hole punching. Diarkis’ client SDK for P2P handles this internally when Connect method is called.

How Does Diarkis Enables P2P?

Diarkis’ distributed arhitecture of the server cluster serves as both STUN and TURN servers. Devices may initiate P2P communication through Diarkis’ client SDK and fallback to TURN servers if necessary.

Diarkis client SDK provides P2P interface. For C# client SDK, read here. Diarkis’ built-in modules also helps you to build applications using P2P.

For example, Match Making module will allow your client devices to search other client devices based on custom attributes. And Room module and/or Field module will make the address exchange between the client deveices simple.

Room module will help you relay messages to other client devices as TURN server would should you have to fallback to relay method.

Value Of Using Diarkis P2P

First of all, scaling out STUN and TURN servers is not easy because both servers are stateful servers. It means that STUN and TURN servers must manage and maintan the connected device states.

You cannot simply add servers to handle more server traffic without providing some form of load balancing.

You cannot simply remove servers to scale in because the states of the devices stored on the removed servers will be gone and STUN and TURN would not perform as expected.

Diarkis’ server cluster solve both problems. The horizontally scalable design of Diarkis server cluster allows scaling out and scaling in without providing anything extra. It can manages the connected devices’ states accordingly.

C# Client Code Example

Below is an example of C# client code showcasing how to implement P2P using Diarkis C# client SDK:

using Diarkis.Modules;

// instantiate a new P2P instance by passing a diarkis UDP client instance that is CONNECTED to the Diarkis server cluster
P2P peerOne = new P2P(diarkisUDPClient);

// OnReady is raised when P2P hole punching was a success
peerOne.OnReady += (string addr, int port, double delayTime) =>
  // P2P is now ready!
  // string addr is the address of the peer
  // int port is the port of the peer
  // double delayTime is the time it took to establish the connection with the peer in milliseconds

// OnFail is raised when P2P hole punching fails
peerOne.OnFail += (string addr, int port) =>
  // P2P failed...
  // string addr is the address of the would have been peer
  // int port is the port of the would have been peer
  // fallback to relay communication

// OnMessage is raised when P2P message from the peer is received
peerOne.OnMessage += (string addr, int port, byte[] msg) =>
  // handle the message from the peer

// Start P2P communication with the peer at addr and port
// If Connect succeeds, it will raise OnReady event
peerOne.Connect(addr, port);

Diarkis enables massive multiplayer network communications.

Contact Us


If you are interested in learning more about Diarkis, please contact us here.

Contact Us Request Documents