Example #1
0
 public void Dispose()
 {
     pbInputStream.Dispose();
     pbOutputStream.Dispose();
     stream.Dispose();
     socket.Close();
 }
        private async Task AcceptConnections()
        {
            if (tcpListener != null)
            {
                tcpListener.Stop();
            }

            tcpListener = new TcpListener(IPAddress.Any, 8080);
            tcpListener.Start();

            try
            {
                while (isAlive)
                {
                    var tcpClient = await tcpListener.AcceptTcpClientAsync();

                    var inputStream  = new CodedInputStream(tcpClient.GetStream(), true);
                    var outputStream = new CodedOutputStream(tcpClient.GetStream(), true);

                    if (Handshake(inputStream, outputStream, out var clientId))
                    {
                        var success = playerStreams.TryAdd((ClientId)clientId, new ClientStreams
                        {
                            InputStream  = inputStream,
                            OutputStream = outputStream
                        });

                        if (!success)
                        {
                            gameEngine.DisconnectPlayer(new PlayerId
                            {
                                Id      = clientId.Value.PlayerId,
                                LobbyId = clientId.Value.LobbyId
                            });

                            var errorMessage = new ErrorMessage
                            {
                                Message = "Something went wrong. Connection aborted",
                                Type    = ErrorType.Other
                            };

                            mapper.Map <Error>(errorMessage).WriteTo(outputStream);

                            outputStream.Dispose();
                            inputStream.Dispose();
                        }
                    }
                }
            }
            catch (ThreadAbortException)
            {
            }
        }
Example #3
0
        /// <summary>
        /// Reads one byte of a varint into lengthStream
        /// </summary>
        /// <param name="s">The stream to read</param>
        /// <returns> -1 if not finished reading or the value of the varint if finished </returns>
        private int ReadVarintByte(MemoryStream s)
        {
            byte nextByte = (byte)s.ReadByte();

            State.LengthStream.WriteByte(nextByte);

            int endOfInt = 0x80 & nextByte; //The most significant bit of each byte is set when there is still more to read

            if (endOfInt == 0)
            {
                //We have the entire varint, so read it
                CodedInputStream coded = new CodedInputStream(State.LengthStream, true);
                State.LengthStream.Seek(0, SeekOrigin.Begin);

                int result = coded.ReadLength();

                coded.Dispose();
                return(result);
            }

            return(-1);
        }