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);
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }