Plane.Sdk3/PlaneGcsSdk_UWP/Communication/UdpServerConnectionManager.UWP.cs

77 lines
2.4 KiB
C#
Raw Normal View History

2017-02-27 02:02:19 +08:00
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();
}
}
}