private void HandleSocketConnection() { var socket = listener.Accept(); var stream = new NetworkStream(socket); byte[] package = BytePackageUtil.ReadPackage(stream); var unwrapped = _packageWrapper.Unwrap(package); if (unwrapped.payload is ConnectionRequest connectionRequest) { var pool = resourcePools[connectionRequest.ConnectionId] = new ResourcePool(); channels[connectionRequest.ConnectionId] = new MultiplexTelemetryChannel( _contractSerializer, _processTelemetryRequest, _processTelemetryEvent, new MultiplexInputSource(pool.GetResource, new NoCryptoProvider()), new MultiplexOutputSink(pool.GetResource, new NoCryptoProvider())); pool.RegisterResource(stream); } else if (unwrapped.payload is ResourceConnectionRequest clientResource) { var pool = resourcePools[clientResource.ConnectionId]; pool.RegisterResource(stream); } }
void Connect() { Guid clientId = Guid.NewGuid(); Socket introduceConnection = new Socket(_endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); introduceConnection.Connect(_endPoint); var initStream = new NetworkStream(introduceConnection); var wrapper = new TelemetryPackageWrapper(_contractSerializer); BytePackageUtil.WritePackage(initStream, _contractSerializer.Serialize(typeof(PayloadPackage), wrapper.Wrap(PackageKind.Request, new ConnectionRequest { ConnectionId = clientId, ResourceCount = Environment.ProcessorCount }))); channelResources.RegisterResource(initStream); var resourceCount = Environment.ProcessorCount * 2; for (int i = 1; i < resourceCount; i++) { Socket clientSocket = new Socket(_endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(_endPoint); var stream = new NetworkStream(clientSocket); BytePackageUtil.WritePackage(stream, _contractSerializer.Serialize(typeof(PayloadPackage), wrapper.Wrap(PackageKind.Request, new ResourceConnectionRequest() { ConnectionId = clientId }))); channelResources.RegisterResource(stream); } }