77 lines
2.4 KiB
C#
77 lines
2.4 KiB
C#
using System;
|
|
using Windows.Networking.Sockets;
|
|
|
|
namespace Plane.Communication
|
|
{
|
|
public partial class UdpServerConnectionManager
|
|
{
|
|
private DatagramSocket _socket;
|
|
|
|
private UdpServerConnectionManager()
|
|
{
|
|
_socket = new DatagramSocket();
|
|
var temp = _socket.BindServiceNameAsync("5250");
|
|
}
|
|
|
|
public void StartReceiving()
|
|
{
|
|
if (_disposed)
|
|
{
|
|
throw new ObjectDisposedException(nameof(UdpServerConnectionManager));
|
|
}
|
|
if (_shouldReceive && _isReceiving)
|
|
{
|
|
return;
|
|
}
|
|
_shouldReceive = true;
|
|
_isReceiving = true;
|
|
_socket.MessageReceived += _socket_MessageReceived;
|
|
}
|
|
|
|
public void StopReceiving()
|
|
{
|
|
if (_shouldReceive)
|
|
{
|
|
_shouldReceive = false;
|
|
_socket.MessageReceived -= _socket_MessageReceived;
|
|
_isReceiving = false;
|
|
}
|
|
}
|
|
|
|
private async void _socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
|
|
{
|
|
try
|
|
{
|
|
var reader = args.GetDataReader();
|
|
var data = new byte[reader.UnconsumedBufferLength];
|
|
reader.ReadBytes(data);
|
|
var remoteAddress = args.RemoteAddress.CanonicalName;
|
|
if (!_connections.ContainsKey(remoteAddress))
|
|
{
|
|
var connection = new UdpServerConnection(await _socket.GetOutputStreamAsync(args.RemoteAddress, args.RemotePort));
|
|
_connections.Add(remoteAddress, connection);
|
|
RaiseConnectionEstablished(connection, remoteAddress);
|
|
}
|
|
else
|
|
{
|
|
var connection = _connections[remoteAddress];
|
|
if (connection.NeedNewOutputStream)
|
|
{
|
|
connection.SetOutputStream(await _socket.GetOutputStreamAsync(args.RemoteAddress, args.RemotePort));
|
|
}
|
|
}
|
|
_connections[remoteAddress].EnqueueDatagram(data);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
System.Diagnostics.Debug.WriteLine(ex);
|
|
}
|
|
}
|
|
|
|
private void DisposeCore()
|
|
{
|
|
_socket.Dispose();
|
|
}
|
|
}
|
|
}
|