Ejemplo n.º 1
0
 public static SocketAwaitable SendAsync(this Socket socket, SocketAwaitable awaitable)
 {
     awaitable.Reset();
     if (!socket.SendAsync(awaitable.EventArgs))
         awaitable.WasCompleted = true;
     return awaitable;
 }
Ejemplo n.º 2
0
 public static SocketAwaitable ReceiveAsync(this Socket socket, SocketAwaitable awaitable)
 {
     awaitable.Reset();
     if (!socket.ReceiveAsync(awaitable.m_eventArgs))
         awaitable.m_wasCompleted = true;
     return awaitable;
 }
 /// <summary>
 /// Begins an asynchronous to disconnect from a remote host using await.
 /// </summary>
 /// <param name="socket">The connected <see cref="Socket"/> object to use.</param>
 /// <param name="awaitable">The <see cref="SocketAwaitable"/> to await on.</param>
 /// <returns>A <see cref="SocketAwaitable"/> object ready to be reused.</returns>
 public static SocketAwaitable DisconnectAsync(this Socket socket, SocketAwaitable awaitable)
 {
     awaitable.Reset();
     if (!socket.DisconnectAsync(awaitable.EventArgs))
     {
         awaitable.IsCompleted = true;
     }
     return(awaitable);
 }
 public static SocketAwaitable SendToAsync(this Socket socket, SocketAwaitable awaitable)
 {
     awaitable.Reset();
     if (!socket.SendToAsync(awaitable.m_eventArgs))
     {
         awaitable.m_wasCompleted = true;
     }
     return awaitable;
 }
 /// <summary>
 /// Begins an asynchronous to a connection to a remote host using await.
 /// </summary>
 /// <param name="socket">The connected <see cref="Socket"/> object to use.</param>
 /// <param name="awaitable">The <see cref="SocketAwaitable"/> to await on.</param>
 /// <returns>A <see cref="SocketAwaitable"/> object ready to be reused.</returns>
 public static SocketAwaitable ConnectAsync(this Socket socket, SocketAwaitable awaitable)
 {
     awaitable.Reset();
     if (!socket.ConnectAsync(awaitable.EventArgs))
     {
         awaitable.IsCompleted = true;
     }
     return awaitable;
 }
Ejemplo n.º 6
0
        /// <summary>
        /// Begins an asynchronous to disconnect from a remote host using await.
        /// </summary>
        /// <param name="socket">The connected <see cref="Socket"/> object to use.</param>
        /// <param name="awaitable">The <see cref="SocketAwaitable"/> to await on.</param>
        /// <returns>A <see cref="SocketAwaitable"/> object ready to be reused.</returns>
        public static SocketAwaitable DisconnectAsync(this Socket socket, SocketAwaitable awaitable)
        {
            awaitable.Reset();

            socket.Dispose();
            awaitable.IsCompleted = true;

            return(awaitable);
        }
Ejemplo n.º 7
0
 /// <summary>
 /// Begins an asynchronous to accept an incoming connection attempt using await.
 /// </summary>
 /// <param name="socket">The connected <see cref="Socket"/> object to use.</param>
 /// <param name="awaitable">The <see cref="SocketAwaitable"/> to await on.</param>
 /// <returns>A <see cref="SocketAwaitable"/> object ready to be reused.</returns>
 public static SocketAwaitable AcceptAsync(this Socket socket, SocketAwaitable awaitable)
 {
     awaitable.Reset();
     if (!socket.AcceptAsync(awaitable.EventArgs))
     {
         awaitable.IsCompleted = true;
     }
     return awaitable;
 }
Ejemplo n.º 8
0
 private static SocketAwaitable ReceiveAsync(this Socket socket,
                                             SocketAwaitable awaitable)
 {
     awaitable.Reset();
     if (!socket.ReceiveAsync(awaitable.EventArgs))
     {
         awaitable.IsCompleted = true;
     }
     return(awaitable);
 }
Ejemplo n.º 9
0
        /// <summary>
        /// Creates a proper awaitable async receive object.
        /// </summary>
        /// <param name="socket"></param>
        /// <param name="awaitable"></param>
        /// <returns></returns>
        internal static SocketAwaitable ReceiveAsync(this Socket socket,
            SocketAwaitable awaitable)
        {
            awaitable.Reset();

            if (!socket.ReceiveAsync(awaitable.pEventArgs))
                awaitable.pWasCompleted = true;

            return awaitable;
        }
Ejemplo n.º 10
0
 public static SocketAwaitable ReceiveAsync(this Socket socket,
                                            SocketAwaitable awaitable)
 {
     awaitable.Reset();
     if (!socket.ReceiveAsync(awaitable.m_eventArgs))
     {
         awaitable.m_wasCompleted = true;
     }
     return(awaitable);
 }
Ejemplo n.º 11
0
 /// <summary>
 /// Begins an asynchronous request to receive data from a connected <see cref="Socket"/> object using await.
 /// </summary>
 /// <param name="awaitable">The <see cref="SocketAwaitable"/> to await on.</param>
 /// <returns>A <see cref="SocketAwaitable"/> object ready to be reused.</returns>
 public static SocketAwaitable ReceiveAsync(this SocketAwaitable awaitable)
 {
     awaitable.Reset();
     var socket = awaitable.EventArgs.AcceptSocket;
     if (!socket.ReceiveAsync(awaitable.EventArgs))
     {
         awaitable.IsCompleted = true;
     }
     return awaitable;
 }
Ejemplo n.º 12
0
        public async Task Send(byte[] buffer, int offset, int length)
        {
            _eventArgs.SetBuffer(buffer, offset, length);
            var isPending = _socket.SendAsync(_eventArgs);

            if (isPending)
            {
                _socketAwaitable.Reset();
                await _socketAwaitable;
            }
        }
Ejemplo n.º 13
0
        public static async Task SendAsync(this Socket socket, SocketAwaitable awaitable)
        {
            var isPending = socket.SendAsync(awaitable._eventArgs);

            if (!isPending)
            {
                return;
            }

            awaitable.Reset();
            await awaitable;
        }
Ejemplo n.º 14
0
        public async Task <int> ReceiveAsync(byte[] buffer, int offset, int maxCountToReceive)
        {
            _readArgs.SetBuffer(buffer, offset, maxCountToReceive);
            var isPending = _socket.ReceiveAsync(_readArgs);

            if (isPending)
            {
                _readAwaitable.Reset();
                await _readAwaitable;
            }

            return(_readArgs.BytesTransferred);
        }
Ejemplo n.º 15
0
        public async Task EnsureEnoughData(int amountOfBytesToGuarantee)
        {
            if (BytesLeftInBuffer >= amountOfBytesToGuarantee)
            {
                return;
            }

            var bytesReceived = 0;

            while (amountOfBytesToGuarantee > 0)
            {
                // Nearing the end of the buffer, we must move all remaining data to the beginning
                // so that we can continue to receive.
                if (Buffer.Length < Offset + BytesLeftInBuffer + amountOfBytesToGuarantee)
                {
                    if (BytesUnallocatedInBuffer - BytesLeftInBuffer < amountOfBytesToGuarantee)
                    {
                        throw new InvalidOperationException("Our buffer is too small.");
                    }

                    System.Buffer.BlockCopy(Buffer, Offset, Buffer, 0, BytesLeftInBuffer);
                    Offset = 0;
                }


                _readArgs.SetBuffer(Buffer, WriteOffset, BytesUnallocatedInBuffer);
                var isPending = _socket.ReceiveAsync(_readArgs);
                if (isPending)
                {
                    _readAwaitable.Reset();
                    await _readAwaitable;
                }

                if (_readArgs.BytesTransferred == 0)
                {
                    throw new InvalidOperationException("We got disconnected. TODO: Change this exception.");
                }

                amountOfBytesToGuarantee -= _readArgs.BytesTransferred;
                bytesReceived            += _readArgs.BytesTransferred;
            }

            WriteOffset += bytesReceived;
        }
Ejemplo n.º 16
0
        protected async Task Connect()
        {
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _writeArgs.RemoteEndPoint = new DnsEndPoint(_remoteHost, _remotePort);
            var isPending = _socket.ConnectAsync(_writeArgs);

            if (isPending)
            {
                _writeAwaitable.Reset();
                await _writeAwaitable;
            }

            _sender   = new SocketSender(_socket, _writeArgs, _writeAwaitable);
            _receiver = new SocketReceiver(_socket, _readArgs, _readAwaitable, _readBuffer);

            await _encoder.EncodeHandshake(_sender, CurrentVersion);

#pragma warning disable 4014 //Need to run it in a separate task to not block the calling class.
            Task.Run(ReceiveMessages);
#pragma warning restore 4014
        }