示例#1
0
 public static SocketAwaitable SendAsync(this Socket socket,
                                         SocketAwaitable awaitable)
 {
     awaitable.Reset();
     if (!socket.SendAsync(awaitable.m_eventArgs))
     {
         awaitable.m_wasCompleted = true;
     }
     return(awaitable);
 }
示例#2
0
        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);
            }
        }