using System; using System.Net.Sockets; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Runtime.CompilerServices; namespace S7.Net { /// /// Extensions to socket for using awaitable socket operations /// public static class SocketExtensions { /// /// https://blogs.msdn.microsoft.com/pfxteam/2011/12/15/awaiting-socket-operations/ /// /// /// /// /// /// /// public static Task ReceiveAsync( this Socket socket, byte[] buffer, int offset, int size, SocketFlags socketFlags) { var tcs = new TaskCompletionSource(socket); socket.BeginReceive(buffer, offset, size, socketFlags, iar => { var t = (TaskCompletionSource)iar.AsyncState; var s = (Socket)t.Task.AsyncState; try { t.TrySetResult(s.EndReceive(iar)); } catch (Exception exc) { t.TrySetException(exc); } }, tcs); return tcs.Task; } /// /// https://blogs.msdn.microsoft.com/pfxteam/2011/12/15/awaiting-socket-operations/ /// /// /// /// /// /// /// public static Task SendAsync( this Socket socket, byte[] buffer, int offset, int size, SocketFlags socketFlags) { var tcs = new TaskCompletionSource(socket); socket.BeginSend(buffer, offset, size, socketFlags, iar => { var t = (TaskCompletionSource)iar.AsyncState; var s = (Socket)t.Task.AsyncState; try { t.TrySetResult(s.EndReceive(iar)); } catch (Exception exc) { t.TrySetException(exc); } }, tcs); return tcs.Task; } /// /// https://blogs.msdn.microsoft.com/pfxteam/2011/12/15/awaiting-socket-operations/ /// /// /// /// /// public static Task ConnectAsync(this Socket socket, System.Net.IPAddress addresses, int port) { var tcs = new TaskCompletionSource(socket); socket.BeginConnect(addresses, port, iar => { var t = (TaskCompletionSource)iar.AsyncState; var s = (Socket)t.Task.AsyncState; try { t.TrySetResult(s.EndReceive(iar)); } catch (Exception exc) { t.TrySetException(exc); } }, tcs); return tcs.Task; } } }