public static SocketAwaitable SendAsync(this Socket socket, SocketAwaitable awaitable) { awaitable.Reset(); if (!socket.SendAsync(awaitable.m_eventArgs)) { awaitable.m_wasCompleted = true; } return(awaitable); }
public static async Task <T> ReadAsync <T>(this Socket s) { // Reusable SocketAsyncEventArgs and awaitable wrapper var args = new SocketAsyncEventArgs(); args.SetBuffer(new byte[DEFAULT_BUFFER_SIZE], 0, DEFAULT_BUFFER_SIZE); var awaitable = new SocketAwaitable(args); var buffer = new byte[DEFAULT_BUFFER_SIZE]; var current = 0; var size = 0; // Do processing, continually receiving from the socket byte[] finisher = null; while (true) { await s.ReceiveAsync(awaitable); int bytesRead = args.BytesTransferred; if (bytesRead <= 0) { break; } size += bytesRead; if (size > buffer.Length) { Array.Resize(ref buffer, buffer.Length + DEFAULT_BUFFER_SIZE); } args.Buffer.CopyTo(buffer, current); current = size; if (size >= 4 && null == finisher) { finisher = new[] { buffer[0], buffer[1], buffer[2], buffer[3] }; } if (size >= 8) { bool br = true; for (var i = 0; i < 4; i++) { if (finisher[i] != buffer[size - (4 - i)]) { br = false; break; } } if (br) { break; } } } var stream = new MemoryStream(buffer, 4, size - 8); if (typeof(IBinarySerializable).IsAssignableFrom(typeof(T))) { var result = Activator.CreateInstance <T>(); var br = new BinaryReader(stream, Encoding.UTF8); ((IBinarySerializable)result).Read(br); return(result); } else { var bf = new BinaryFormatter(); var result = bf.Deserialize(stream); return((T)result); } }