public async Task<bool> Open(string address = null, int port = -1)
        {
            try
            {
                IPEndPoint server = new IPEndPoint(IPAddress.Parse(_address), _port);
                SocketAsyncEventArgs args = new SocketAsyncEventArgs();
				args.SocketFlags = SocketFlags.None;
                args.RemoteEndPoint = server;
                var awaitable = new SocketAwaitable(args);
                awaitable.OnCompleted(() => {
                    RaiseConnected();
                    //Flush();                    
                    //Receive();
                });

                _socket = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp);                
                await _socket.ConnectAsync(awaitable);
                return awaitable.IsCompleted;
            }
            catch (Exception ex)
            {
                RaiseError(ex);
                throw;
            }
        }
        public async Task<bool> Close()
        {
            try
            {
                if (_socket != null && _socket.Connected)
                {    
                    await Flush();
                    _socket.Shutdown(SocketShutdown.Both);
					SocketAsyncEventArgs args = new SocketAsyncEventArgs();            
                    var awaitable = new SocketAwaitable(args);
                    awaitable.OnCompleted(() => {
                        RaiseDisconnected();
                        // cancel pending receives
                    });
                    await _socket.DisconnectAsync(awaitable);
                    return !awaitable.IsCompleted;
                }            
				return false;
            }
            catch (Exception ex)
            {
                RaiseError(ex);
                throw;
            }
        }
 public async Task<bool> Flush()
 {
     try
     {
         if (_socket == null)
             return false;
         if (_tosend.IsEmpty)
             return false;
         
         byte[] data;
         while (_tosend.TryDequeue(out data))
         {
             SocketAsyncEventArgs args = new SocketAsyncEventArgs();
             args.SetBuffer(data, 0, data.Length);
             var awaitable = new SocketAwaitable(args);                    
             awaitable.OnCompleted(() => {
                 RaiseSent(awaitable.GetResult());                        
             });
             await _socket.SendAsync(awaitable);                    
         }
         return true;
     }
     catch (Exception ex)
     {
         RaiseError(ex);
         throw;
     }
 }