private async void ConnectionBegunCallback(IAsyncResult asyncResult)
        {
            try
            {
                var client = (TcpClient)asyncResult.AsyncState;

                client.EndConnect(asyncResult);

                _currentUser.NetworkStream = client.GetStream();

                if (_currentUser.NetworkStream == null)
                {
                    _connectionFailedCallback.Invoke();
                    return;
                }

                var msg = new ConnectRequestMessage {
                    ChatEnterMessage = "Hello", UserId = (ushort)_currentUser.Id
                };

                await _networkDataService.WriteAndEncodeMessageWithHeader(msg, _currentUser.NetworkStream);

                _connectionSuccseful.Invoke();
            }
            catch (Exception)
            {
                if (_connectionFailedCallback == null)
                {
                    throw new Exception("No failed connection callback set.");
                }
                _connectionFailedCallback.Invoke();
            }
        }
        protected void SendConnect(string clientId,
                                   ITransportConnection connection)
        {
            var message = new ConnectRequestMessage(clientId: clientId,
                                                    connectionType: ONLY_SUPPORTED_CONNECTION_TYPE,
                                                    id: MessageCounter++);
            var json = Converter.Serialize(message);

            connection.Send(json);
        }
示例#3
0
        public static async Task <SmartGlassClient> ConnectAsync(
            string addressOrHostname, string xboxLiveUserHash, string xboxLiveAuthorization)
        {
            var device = await Device.PingAsync(addressOrHostname);

            var cryptoContext = new CryptoContext(device.Certificate);

            using (var transport = new MessageTransport(device.Address.ToString(), cryptoContext))
            {
                var deviceId       = Guid.NewGuid();
                var sequenceNumber = 0u;

                var initVector = CryptoContext.GenerateRandomInitVector();

                Func <Task> connectFunc = async() =>
                {
                    var requestMessage = new ConnectRequestMessage();

                    requestMessage.InitVector = initVector;

                    requestMessage.DeviceId = deviceId;

                    requestMessage.UserHash      = xboxLiveUserHash;
                    requestMessage.Authorization = xboxLiveAuthorization;

                    requestMessage.SequenceNumber = sequenceNumber;
                    requestMessage.SequenceBegin  = sequenceNumber + 1;
                    requestMessage.SequenceEnd    = sequenceNumber + 1;

                    sequenceNumber += 2;

                    await transport.SendAsync(requestMessage);
                };

                var response = await TaskExtensions.WithRetries(() =>
                                                                transport.WaitForMessageAsync <ConnectResponseMessage>(
                                                                    connectTimeout,
                                                                    () => connectFunc().Wait()),
                                                                connectRetries);

                return(new SmartGlassClient(
                           device,
                           response,
                           cryptoContext));
            }
        }
        /// <summary>
        /// Connect to a discovered console
        /// </summary>
        /// <param name="device">Discovered, available console</param>
        /// <param name="xboxLiveUserHash">Xbox Live userhash (uhs)</param>
        /// <param name="xboxLiveAuthorization">Xbox Live authorization token (XToken)</param>
        /// <returns></returns>
        public static async Task <SmartGlassClient> ConnectAsync(
            Device device, string xboxLiveUserHash, string xboxLiveAuthorization)
        {
            bool connectAuthenticated = !String.IsNullOrEmpty(xboxLiveUserHash) &&
                                        !String.IsNullOrEmpty(xboxLiveAuthorization);

            if (device.State == DeviceState.Unavailable)
            {
                throw new SmartGlassException("Target device state is 'Unavailable'.");
            }
            else if (!connectAuthenticated && !device.Flags.HasFlag(DeviceFlags.AllowAnonymousUsers))
            {
                throw new SmartGlassException("Anonymous connection forbidden.");
            }

            var cryptoContext = new CryptoContext(device.Certificate);
            ConnectResponseMessage response;

            using (var transport = new MessageTransport(device.Address.ToString(), cryptoContext))
            {
                Guid deviceId = Guid.NewGuid();
                async Task connectFunc()
                {
                    foreach (var fragment in ConnectRequestMessage
                             .GenerateConnectRequest(deviceId, cryptoContext, xboxLiveUserHash, xboxLiveAuthorization))
                    {
                        await transport.SendAsync(fragment);
                    }
                }

                response = await Common.TaskExtensions.WithRetries(() =>
                                                                   transport.WaitForMessageAsync <ConnectResponseMessage>(
                                                                       connectTimeout,
                                                                       connectFunc),
                                                                   connectRetries);
            }
            var client = new SmartGlassClient(
                device,
                response,
                cryptoContext);
            await client._InitTask;

            return(client);
        }
示例#5
0
        public async Task <IMessage> ReadAndDecodeMessage(Header header, NetworkStream networkStream)
        {
            byte[] dataBuffer = new byte[header.MessageSize];

            await networkStream.ReadAsync(dataBuffer, 0, dataBuffer.Length);

            Console.WriteLine("message type being read in network service: " + header.MessageType);

            var dataBufferList = dataBuffer.ToList();

            switch (header.MessageType)
            {
            case MessageType.NotSet:
                return(null);

            case MessageType.Connect:
                return(ConnectRequestMessage.Decode(dataBufferList));

            case MessageType.Chat:
                return(ChatMessage.Decode(dataBufferList));

            case MessageType.Image:
                return(ImageMessage.Decode(dataBufferList));

            case MessageType.NewUserOnline:
                return(NewUserOnlineMessage.Decode(dataBufferList));

            case MessageType.UserLogoff:
                return(UserLogoffMessage.Decode(dataBufferList));

            case MessageType.UserOffline:
                return(UserOfflineMessage.Decode(dataBufferList));

            case MessageType.Typing:
                return(UserTypingMessage.Decode(dataBufferList));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
示例#6
0
        private static async Task <Tuple <int, NetworkStream> > SetupClient(string ip)
        {
            var client = new TcpClient();

            client.Connect(new IPEndPoint(IPAddress.Parse("172.30.142.49"), 2500));

            var random = new Random();

            var stream = client.GetStream();

            var msg = new ConnectRequestMessage()
            {
                UserId           = 7,
                ChatEnterMessage = "Hello"
            };

            await service.WriteAndEncodeMessageWithHeader(msg, stream);

            BeginListening(stream);

            return(new Tuple <int, NetworkStream>(msg.UserId, stream));
        }
示例#7
0
 public bool TryAcceptNewPlayer(ConnectRequestMessage connectRequestMessage, out ConnectResponseMessage responseMessage)
 {
     throw new NotImplementedException();
 }