public async Task <ClientResponse> Request(ClientRequest request) { IPEndPoint dns = request.Dns; #if (!PORTABLE) using (UdpClient udp = new UdpClient()) #else using (Sockets.Plugin.UdpSocketClient udp = new Sockets.Plugin.UdpSocketClient()) #endif { #if (!PORTABLE) var bytes = request.ToArray(); await udp .SendAsync(bytes, request.Size, dns) .WithCancellationTimeout(TIMEOUT); #else string ip = request.Dns.Address.ToString(); ip = request.Dns.Address.ToString().Replace(":", "."); await udp.ConnectAsync(ip, request.Dns.Port); await udp .SendAsync(request.ToArray()); #endif #if (!PORTABLE) UdpReceiveResult result = await udp.ReceiveAsync().WithCancellationTimeout(TIMEOUT); if (!result.RemoteEndPoint.ToString().Replace(".", ":").Equals(dns.ToString())) { throw new IOException("Remote endpoint mismatch"); } byte[] buffer = result.Buffer; #else ManualResetEvent ev = new ManualResetEvent(false); byte[] buffer = null; udp.MessageReceived += (s, e) => { buffer = e.ByteData; ev.Set(); }; if (!ev.WaitOne(TIMEOUT)) { throw new System.TimeoutException(); } #endif Response response = Response.FromArray(buffer); if (response.Truncated) { return(await fallback.Request(request)); } return(new ClientResponse(request, response, buffer)); } }
internal void DisposedClient(Sockets.Plugin.UdpSocketClient client)