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) { } }
/// <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); }