public Connection(string name = "", IPAddress address = null, int rpcPort = 50000, int streamPort = 50001) { if (address == null) { address = IPAddress.Loopback; } rpcClient = new TcpClient(); rpcClient.Connect(address, rpcPort); rpcStream = rpcClient.GetStream(); codedRpcStream = new CodedOutputStream(rpcStream, true); var request = new ConnectionRequest(); request.Type = Type.Rpc; request.ClientName = name; codedRpcStream.WriteLength(request.CalculateSize()); request.WriteTo(codedRpcStream); codedRpcStream.Flush(); int size = ReadMessageData(rpcStream, ref responseBuffer); var response = ConnectionResponse.Parser.ParseFrom(new CodedInputStream(responseBuffer, 0, size)); if (response.Status != ConnectionResponse.Types.Status.Ok) { throw new ConnectionException(response.Message); } if (streamPort != 0) { streamClient = new TcpClient(); streamClient.Connect(address, streamPort); var streamStream = streamClient.GetStream(); request = new ConnectionRequest(); request.Type = Type.Stream; request.ClientIdentifier = response.ClientIdentifier; var codedStreamStream = new CodedOutputStream(streamStream, true); codedStreamStream.WriteLength(request.CalculateSize()); request.WriteTo(codedStreamStream); codedStreamStream.Flush(); size = ReadMessageData(streamStream, ref responseBuffer); response = ConnectionResponse.Parser.ParseFrom(new CodedInputStream(responseBuffer, 0, size)); if (response.Status != ConnectionResponse.Types.Status.Ok) { throw new ConnectionException(response.Message); } StreamManager = new StreamManager(this, streamClient); } Services.KRPC.Service.AddExceptionTypes(this); }