-
Notifications
You must be signed in to change notification settings - Fork 141
/
IceServer.cs
74 lines (64 loc) · 2 KB
/
IceServer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Threading.Tasks;
using Libplanet.Stun;
namespace Libplanet.Net
{
public class IceServer
{
public IceServer(
IEnumerable<string> urls,
string username = null,
string credential = null)
: this(urls.Select(u => new Uri(u)), username, credential)
{
}
public IceServer(
IEnumerable<Uri> urls,
string username = null,
string credential = null)
{
Urls = urls;
Username = username;
Credential = credential;
}
public IEnumerable<Uri> Urls { get; }
public string Username { get; }
public string Credential { get; }
internal static async Task<TurnClient> CreateTurnClient(
IEnumerable<IceServer> iceServers)
{
foreach (IceServer server in iceServers)
{
foreach (Uri url in server.Urls)
{
if (url.Scheme != "turn")
{
continue;
}
try
{
int port = url.IsDefaultPort
? TurnClient.TurnDefaultPort
: url.Port;
var turnClient = new TurnClient(
url.Host,
server.Username,
server.Credential,
port);
// Check connectability
await turnClient.GetMappedAddressAsync();
return turnClient;
}
catch (SocketException)
{
continue;
}
}
}
throw new IceServerException("Can't find suitable server.");
}
}
}