76 lines
2.3 KiB
C#
76 lines
2.3 KiB
C#
|
#if !NETFX_CORE
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Net;
|
|||
|
using System.Net.Sockets;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
namespace Plane.Communication
|
|||
|
{
|
|||
|
public partial class UdpThroughDtuServiceConnection
|
|||
|
{
|
|||
|
private UdpClient _client;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 初始化 <see cref="UdpServerConnection"/> 的实例,并指定远程终结点和发送数据所使用的方法。
|
|||
|
/// </summary>
|
|||
|
public UdpThroughDtuServiceConnection(string ip, int port)
|
|||
|
{
|
|||
|
DtuServiceIP = ip;
|
|||
|
DtuServicePort = port;
|
|||
|
_client = new UdpClient();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 登陆到Dtu服务端。
|
|||
|
/// 登陆方式极其简单,只需发送一个数据包(内含希望连接到的飞机ID)
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public virtual async Task OpenAsync()
|
|||
|
{
|
|||
|
if (!string.IsNullOrEmpty(CopterIDToBind))
|
|||
|
{
|
|||
|
_client.Connect(IPAddress.Parse(DtuServiceIP), DtuServicePort);
|
|||
|
var bytes = ConstructHandShakeDatagramToDTUService();
|
|||
|
await _client.SendAsync(bytes, bytes.Length);
|
|||
|
|
|||
|
//等待服务端的应答,获取是否连接成功飞机的结果
|
|||
|
var result = await _client.ReceiveAsync();
|
|||
|
var ret = AnalyzeHandShakeDatagramFromDTUService(result.Buffer);
|
|||
|
if (ret == DTUHandShakeResult.Successful)
|
|||
|
{
|
|||
|
IsOpen = true;
|
|||
|
}
|
|||
|
else if (ret == DTUHandShakeResult.Occupied)
|
|||
|
{
|
|||
|
throw new Exception("飞机已被占用!");
|
|||
|
}
|
|||
|
else if (ret == DTUHandShakeResult.NotExisted)
|
|||
|
{
|
|||
|
throw new Exception("飞机不存在!");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public virtual void Close()
|
|||
|
{
|
|||
|
IsOpen = false;
|
|||
|
_client.Close();
|
|||
|
}
|
|||
|
|
|||
|
private async Task SendAsync(byte[] datagram, int bytes)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
await _client.SendAsync(datagram, bytes).ConfigureAwait(false);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
Close();
|
|||
|
RaiseExceptionThrown(ex);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endif
|