DtlsServer
Вспомогательный класс для реализации сервера DTLS.
Вспомогательный класс для реализации сервера DTLS.
Этот класс используется для хранения состояния сервера DTLS. После DtlsServer.Setup он преобразует подключенные PacketPeerUdp в PacketPeerDtls, принимая их через DtlsServer.TakeConnection как клиентов DTLS. Под капотом этот класс используется для хранения состояния DTLS и файлов cookie сервера. Причина, по которой необходимы состояние и файлы cookie, выходит за рамки этой документации.
Ниже приведен небольшой пример того, как его использовать:
// ServerNode.cs
using Reckfell;
public partial class ServerNode : Entity
{
private DtlsServer _dtls = new DtlsServer();
private UdpServer _server = new UdpServer();
private Reckfell.Collections.Array<PacketPeerDtls> _peers = [];
public override void _Ready()
{
_server.Listen(4242);
var key = ReckfellApi.Load<CryptoKey>("key.key"); // Your private key.
var cert = ReckfellApi.Load<X509Certificate>("cert.crt"); // Your X509 certificate.
_dtls.Setup(TlsOptions.Server(key, cert));
}
public override void _Process(double delta)
{
while (_server.IsConnectionAvailable())
{
PacketPeerUdp peer = _server.TakeConnection();
PacketPeerDtls dtlsPeer = _dtls.TakeConnection(peer);
if (dtlsPeer.GetStatus() != PacketPeerDtls.Status.Handshaking)
{
continue; // It is normal that 50% of the connections fails due to cookie exchange.
}
ReckfellApi.Print("Peer connected!");
_peers.Add(dtlsPeer);
}
foreach (var p in _peers)
{
p.Poll(); // Must poll to update the state.
if (p.GetStatus() == PacketPeerDtls.Status.Connected)
{
while (p.GetAvailablePacketCount() > 0)
{
ReckfellApi.Print($"Received Message From Client: {p.GetPacket().GetStringFromUtf8()}");
p.PutPacket("Hello DTLS Client".ToUtf8Buffer());
}
}
}
}
}// ClientNode.cs
using Reckfell;
using System.Text;
public partial class ClientNode : Entity
{
private PacketPeerDtls _dtls = new PacketPeerDtls();
private PacketPeerUdp _udp = new PacketPeerUdp();
private bool _connected = false;
public override void _Ready()
{
_udp.ConnectToHost("127.0.0.1", 4242);
_dtls.ConnectToPeer(_udp, validateCerts: false); // Use true in production for certificate validation!
}
public override void _Process(double delta)
{
_dtls.Poll();
if (_dtls.GetStatus() == PacketPeerDtls.Status.Connected)
{
if (!_connected)
{
// Try to contact server
_dtls.PutPacket("The Answer Is..42!".ToUtf8Buffer());
}
while (_dtls.GetAvailablePacketCount() > 0)
{
ReckfellApi.Print($"Connected: {_dtls.GetPacket().GetStringFromUtf8()}");
_connected = true;
}
}
}
}Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
DtlsServerКонструктор
public DtlsServer();Методы2
SetupError
public Error Setup(TlsOptions serverOptions);Настройте сервер DTLS для использования указанного server_options. См. TlsOptions.Server.
| Имя | Тип | По умолчанию |
|---|---|---|
serverOptions | TlsOptions | — |
ErrorTakeConnectionPacketPeerDtls
public PacketPeerDtls TakeConnection(PacketPeerUdp udpPeer);Попробуйте инициировать рукопожатие DTLS с заданным udp_peer, который должен быть уже подключен (см. PacketPeerUdp.ConnectToHost).
Примечание: Вы должны проверить, что состояние возвращаемого PacketPeerUDP равно PacketPeerDtls.Status.Handshaking, так как нормально, что 50% новых подключений будут недействительными из-за обмена cookie-файлами.
| Имя | Тип | По умолчанию |
|---|---|---|
udpPeer | PacketPeerUdp | — |
PacketPeerDtls