/// <summary>
 ///     Create new instance of PeerConnectionFailedEventArgs for peer from given torrent.
 /// </summary>
 /// <param name="manager"></param>
 /// <param name="peer"></param>
 /// <param name="direction">Which direction the connection attempt was</param>
 /// <param name="message">Message associated with the failure</param>
 public PeerConnectionFailedEventArgs(TorrentManager manager, Peer peer, Direction direction, string message)
     : base(manager)
 {
     Peer = peer;
     ConnectionDirection = direction;
     Message = message;
 }
예제 #2
0
파일: Synchronizer.cs 프로젝트: npenin/uss
        /// <summary>
        /// Gets the peer metadata engine.
        /// </summary>
        /// <param name="engine">The engine.</param>
        /// <param name="peer">The peer.</param>
        /// <returns></returns>
        private IPersistenceEngine GetPeerMetadataEngine(SyncEngine engine, Peer peer)
        {
            if (engine.SecondaryMetadataEngine == null || peer == Peer.Client)
                return engine.MetadataEngine;

            return engine.SecondaryMetadataEngine;
        }
예제 #3
0
 private void UpdatePeerSubscription(Peer peer, BindingKey subscription, UpdateAction action)
 {
     if (subscription.IsEmpty)
         UpdatePeersMatchingAllMessages(peer, action);
     else
         _rootNode.Update(peer, subscription, action);
 }
예제 #4
0
        public void should_resolve_peer_using_basic_round_robin_for_different_commands()
        {
            // Arrange
            var resolver = new RoundRobinPeerSelector();
            
            var command1 = new FakeCommand(42);
            var command1Peer1 = new Peer(new PeerId("command1peer1"), "endpoint1");
            var command1Peer2 = new Peer(new PeerId("command1peer2"), "endpoint2");
            var command1HandlingPeer = new[] { command1Peer1, command1Peer2 };

            var command2 = new FakeInfrastructureCommand();
            var command2Peer1 = new Peer(new PeerId("command2peer1"), "endpoint1");
            var command2Peer2 = new Peer(new PeerId("command2peer2"), "endpoint2");
            var command2HandlingPeer = new[] { command2Peer1, command2Peer2 };

            // Act - Assert
            var resolvedPeer = resolver.GetTargetPeer(command1, command1HandlingPeer);
            resolvedPeer.ShouldEqual(command1Peer1);

            resolvedPeer = resolver.GetTargetPeer(command1, command1HandlingPeer);
            resolvedPeer.ShouldEqual(command1Peer2);

            resolvedPeer = resolver.GetTargetPeer(command2, command2HandlingPeer);
            resolvedPeer.ShouldEqual(command2Peer1);

            resolvedPeer = resolver.GetTargetPeer(command1, command1HandlingPeer);
            resolvedPeer.ShouldEqual(command1Peer1);

            resolvedPeer = resolver.GetTargetPeer(command2, command2HandlingPeer);
            resolvedPeer.ShouldEqual(command2Peer2);

            resolvedPeer = resolver.GetTargetPeer(command2, command2HandlingPeer);
            resolvedPeer.ShouldEqual(command2Peer1);
        }
예제 #5
0
        public Task SendGetHeaders(Peer peer)
        {
            if (!IsStarted)
                return Task.CompletedTask;

            var targetChainLocal = this.coreDaemon.TargetChain;
            if (targetChainLocal == null)
                return Task.CompletedTask;

            var blockLocatorHashes = CalculateBlockLocatorHashes(targetChainLocal.Blocks);

            // remove an existing request for this peer if it's stale
            var now = DateTimeOffset.Now;
            DateTimeOffset requestTime;
            if (this.headersRequestsByPeer.TryGetValue(peer, out requestTime)
                && (now - requestTime) > STALE_REQUEST_TIME)
            {
                this.headersRequestsByPeer.TryRemove(peer, out requestTime);
            }

            // determine if a new request can be made
            if (this.headersRequestsByPeer.TryAdd(peer, now))
                // send out the request for headers
                return peer.Sender.SendGetHeaders(blockLocatorHashes, hashStop: UInt256.Zero);
            else
                return Task.CompletedTask;
        }
예제 #6
0
        public void should_not_block_when_hitting_high_water_mark()
        {
            var senderTransport = CreateAndStartZmqTransport();
            senderTransport.SocketOptions.SendHighWaterMark = 3;
            senderTransport.SocketOptions.SendTimeout = 50.Milliseconds();
            senderTransport.SocketOptions.SendRetriesBeforeSwitchingToClosedState = 2;

            var receviedMessages = new List<TransportMessage>();
            var upReceiverTransport = CreateAndStartZmqTransport(onMessageReceived: receviedMessages.Add);
            var upReceiver = new Peer(new PeerId("Abc.Testing.Receiver.Up"), upReceiverTransport.InboundEndPoint);

            var downReceiverTransport = CreateAndStartZmqTransport();
            var downReceiver = new Peer(new PeerId("Abc.Testing.Receiver.Down"), downReceiverTransport.InboundEndPoint);

            downReceiverTransport.Stop();

            for (var i = 1; i <= 10; ++i)
            {
                var message = new FakeCommand(i).ToTransportMessage();
                senderTransport.Send(message, new[] { upReceiver, downReceiver });

                var expectedMessageCount = i;
                Wait.Until(() => receviedMessages.Count == expectedMessageCount, 500.Milliseconds(), "Failed to send message after " + i + " successful sent");
            }
        }
    /// <summary>
    /// Constructor
    /// </summary>
    public ChooseServiceProviderForm(Peer peerObject, ConnectWizard connectionWizard)
    {
        //
        // Required for Windows Form Designer support
        //
        InitializeComponent();
        peer = peerObject;
        this.connectionWizard = connectionWizard;
        this.Text = connectionWizard.SampleName + " - " + this.Text;
        // Fill up our listbox with the service providers
        ServiceProviderInformation[] serviceProviders = peer.GetServiceProviders(false);
        foreach (ServiceProviderInformation info in serviceProviders)
            lstSP.Items.Add(info);

        txtUser.Text = null;
        //Get the default username from the registry if it exists
        Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\DirectX\\SDK\\csDPlay");
        if (regKey != null) {
            try {
                txtUser.Text = (string)regKey.GetValue("DirectPlayUserName", null);
                lstSP.SelectedIndex = (int)regKey.GetValue("DirectPlaySPIndex", 0);
                regKey.Close();
            }
            catch {
                txtUser.Text = null;
                lstSP.SelectedIndex = 0;
            }
        }
        else
            lstSP.SelectedIndex = 0;

        if ((txtUser.Text == null) || (txtUser.Text == "")) {
            txtUser.Text = SystemInformation.UserName;
        }
    }
예제 #8
0
 public FlowStream(ulong id, string signature, Peer peer, BaseRtmfpProtocol handler, Session band,FlowWriter localFlow)
     : base(id, signature, _Name, peer, handler, band, localFlow)
 {
     if (handler.StreamsManager?.StreamsByType.ContainsKey(StreamTypes.ST_IN_NET_RTMFP)??false)
     _publisher = handler.StreamsManager.StreamsByType[StreamTypes.ST_IN_NET_RTMFP].Select(x => x.Value as InNetRtmfpStream).SingleOrDefault(x=>x.PublisherId==StreamId);
     //_publication = handler.Publications.Values.SingleOrDefault(x => x.PublisherId == _index);
 }
예제 #9
0
        internal ConnectionPool(Peer peer, int preAllocateAmount)
        {
            #if DEBUG
            if (peer == null)
            {
                throw new ArgumentNullException("peer");
            }
            #endif

            this.peer = peer;

            Connection connection;

            for (var i = 0; i < preAllocateAmount; ++i)
            {
                if (TryAllocate(out connection))
                {
                    if (!TryPush(connection))
                    {
                        //TODO: Error
                    }
                }
                else
                {
                    //TODO: Error
                    break;
                }
            }
        }
예제 #10
0
 public void Start(Peer peer, uint publisherId, FlowWriter controller)
 {
     if (PublisherId != 0)
     {
         if (controller != null)
         {
             controller.WriteStatusResponse("Publish.BadName", Name + "is already published");
         }
     }
     PublisherId = publisherId;
    
     string error;
     if (!peer.OnPublish(this, out error))
     {
         if (String.IsNullOrEmpty(error)) error = "Not allowed to publish " + Name;
     }
     _publisher = peer;
     _controller = controller;
     _firstKeyFrame = false;
     foreach (var listener in Listeners)
     {
         listener.Value.StartPublishing(Name);
     }
     Flush();
     if (controller != null)
     {
         controller.WriteStatusResponse("Publish.Start", Name + "is now published");
     }
 }
예제 #11
0
        private void UpdateCore(Peer peer, Subscription subscription, bool isAddOrUpdate)
        {
            if (subscription.IsMatchingAllMessages)
            {
                var list = _peersHandlingAllMessages
                    .Where(i => i.Id != peer.Id)
                    .ToList();

                if (isAddOrUpdate)
                    list.Add(peer);

                _peersHandlingAllMessages = list;
            }
            else
            {
                var list = _dynamicPeerSubscriptions
                    .Where(item => item.Peer.Id != peer.Id || !Equals(item.Subscription, subscription))
                    .ToList();

                if (isAddOrUpdate)
                    list.Add(new PeerSubscription(peer, subscription));

                Interlocked.Exchange(ref _dynamicPeerSubscriptions, list);
            }
        }
예제 #12
0
 public DiscoverBuilder(Peer peer)
 {
     _peer = peer;
     PortUdp = Ports.DefaultPort;
     PortTcp = Ports.DefaultPort;
     DiscoverTimeoutSec = 5;
 }
    /// <summary>
    /// Constructor
    /// </summary>
    public CreateJoinForm(Peer peerObject, Address addressObject, ConnectWizard connectionWizard)
    {
        //
        // Required for Windows Form Designer support
        //
        InitializeComponent();
        peer = peerObject;
        this.connectionWizard = connectionWizard;
        this.Text = connectionWizard.SampleName + " - " + this.Text;
        deviceAddress = addressObject;

        //Set up the event handlers
        peer.FindHostResponse += new FindHostResponseEventHandler(FindHostResponseMessage);
        peer.ConnectComplete += new ConnectCompleteEventHandler(ConnectResult);
        peer.AsyncOperationComplete += new AsyncOperationCompleteEventHandler(CancelAsync);

        //Set up our timer
        updateListTimer = new System.Timers.Timer(300); // A 300 ms interval
        updateListTimer.Elapsed += new System.Timers.ElapsedEventHandler(this.UpdateTimer);
        updateListTimer.SynchronizingObject = this;
        updateListTimer.Start();
        //Set up our connect timer
        connectTimer = new System.Timers.Timer(100); // A 100ms interval
        connectTimer.Elapsed += new System.Timers.ElapsedEventHandler(this.ConnectTimer);
        connectTimer.SynchronizingObject = this;
        // Set up our connect event
        connectEvent = new ManualResetEvent(false);
    }
예제 #14
0
        /**
         * Get the results from browsing and put it into the sharedFileList folder of the peer.
         * Should maybe change the key to a Peer , but since implementation is unknown
         * no assurance that hashcode will be the same ...
         * */
        public void BrowsingTerminated(Peer peer, SearchResult Results, List<G2PacketQH2> resultPackets)
        {
            if (resultPackets.Count == 0)
            {
                RegroupResults(Results); // if no results from browsing directly sends results
                return;
            }
            Results.PeerCollection.Add(peer);
            Peer p = Results.PeerCollection.Find(peer);

            int fileCount = 0;
            // add results !!
            foreach(G2PacketQH2 qh2 in resultPackets)
            {
                foreach(G2Packet child in qh2.children)
                {
                    if (!child.type.Equals(G2PacketType.H))
                        continue;
                    G2PacketH hit = child as G2PacketH;
                    G2File file = G2File.ParseHit(hit,FileLocationFound.SharedLocalComputer);
                    if (file == null) continue;
                    p.SharedLocalfilesList.Add(file);
                    file.PeerDiffusedFiles.Add(p);
                    SharedTotalFiles++;
                    fileCount++;
                }
            }

            G2Log.Write("SearchResults : New Browsing Result from " + p.Ip + ":" + p.Port + " ==> " + p.Files.Count + " files && " + p.SharedLocalfilesList.Count + " shared files ...");

            RegroupResults(Results);
        }
예제 #15
0
 public PeerDescriptor(PeerId id, string endPoint, bool isPersistent, bool isUp, bool isResponding, DateTime timestampUtc, params Subscription[] subscriptions)
 {
     Peer = new Peer(id, endPoint, isUp, isResponding);
     Subscriptions = subscriptions;
     IsPersistent = isPersistent;
     TimestampUtc = timestampUtc;
 }
예제 #16
0
 internal PeerDescriptor(PeerDescriptor other)
 {
     Peer = new Peer(other.Peer);
     Subscriptions = ArrayUtil.Copy(other.Subscriptions) ?? ArrayUtil.Empty<Subscription>();
     IsPersistent = other.IsPersistent;
     TimestampUtc = other.TimestampUtc;
     HasDebuggerAttached = other.HasDebuggerAttached;
 }
        public NewConnectionEventArgs(Peer peer, IConnection connection, TorrentManager manager)
            : base(manager)
        {
            if (!connection.IsIncoming && manager == null)
                throw new InvalidOperationException("An outgoing connection must specify the torrent manager it belongs to");

            this.connection = connection;
            this.peer = peer;
        }
        public void Setup()
        {
            _configurationMock = new Mock<IDirectoryConfiguration>();
            _bus = new TestBus();

            var peer = new Peer(new PeerId("Abc.Testing.0"), "tcp://abctest:12300");
            var peerDescriptor = peer.ToPeerDescriptor(true);
            _entry = new DeadPeerDetectorEntry(peerDescriptor, _configurationMock.Object, _bus, new CurrentThreadTaskScheduler());
        }
예제 #19
0
        public static TransportMessage ToTransportMessage(this IMessage message, Peer sender = null)
        {
            sender = sender ?? new Peer(new PeerId("Abc.Testing.Peer"), "tcp://abctest:159");

            var serializer = new MessageSerializer();
            var messageBytes = serializer.Serialize(message);

            return new TransportMessage(message.TypeId(), messageBytes, sender);
        }
 public PeerEntry(PeerDescriptor descriptor, ConcurrentDictionary<MessageTypeId, PeerSubscriptionTree> globalSubscriptionsIndex)
 {
     Peer = new Peer(descriptor.Peer);
     IsPersistent = descriptor.IsPersistent;
     TimestampUtc = descriptor.TimestampUtc ?? DateTime.UtcNow;
     HasDebuggerAttached = descriptor.HasDebuggerAttached;
     
     _globalSubscriptionsIndex = globalSubscriptionsIndex;
 }
예제 #21
0
        public void simple_subscription_key_should_simple_routing_key()
        {
            var peerSubscriptionTree = new PeerSubscriptionTree();
            var peer = new Peer(new PeerId("Abc.Testing.0"), "tcp://test:123");
            peerSubscriptionTree.Add(peer, new BindingKey("a"));

            var matchingPeer = peerSubscriptionTree.GetPeers(new BindingKey("a")).ExpectedSingle();
            matchingPeer.Id.ShouldEqual(peer.Id);
        }
예제 #22
0
    void Start()
    {
        InputFieldAddress.text = "127.0.0.1";

        peer = new Peer(PORT);
        peer.onConnectionReceived += new Peer.ConnectionHandler(onPeerConnected);

        Debug.Log ("Socket alive: " + peer.socketAlive.ToString());
    }
 private Networking()
 {
     peer = new Peer();
     //peer.ApplicationDescription.SessionName = "Turbo Gravity Lemming Raketty Force";
     peer.PlayerCreated += new PlayerCreatedEventHandler(peer_PlayerCreated);
     peer.PlayerDestroyed += new PlayerDestroyedEventHandler(peer_PlayerDestroyed);
     peer.PeerInformation += new PeerInformationEventHandler(peer_PeerInformation);
     peer.Receive += new ReceiveEventHandler(peer_Receive);
 }
예제 #24
0
        public void empty_subscription_key_should_match_empty_routing_key()
        {
            var peerSubscriptionTree = new PeerSubscriptionTree();
            var peer = new Peer(new PeerId("Abc.Testing.0"), "tcp://test:123");
            peerSubscriptionTree.Add(peer, BindingKey.Empty);

            var matchingPeer = peerSubscriptionTree.GetPeers(BindingKey.Empty).ExpectedSingle();
            matchingPeer.Id.ShouldEqual(peer.Id);
        }
예제 #25
0
        private static void UpdateList(ref List<Peer> peers, Peer peer, UpdateAction action)
        {
            var newPeers = new List<Peer>(peers.Capacity);
            newPeers.AddRange(peers.Where(x => x.Id != peer.Id));

            if (action == UpdateAction.Add)
                newPeers.Add(peer);

            peers = newPeers;
        }
예제 #26
0
 public static InputPeer PeerToInputPeer(Peer peer) {
     switch(peer.Constructor) {
         case Constructor.peerUser: // TODO: foreign and self cases
             return TL.inputPeerContact(((PeerUserConstructor) peer).user_id);
         case Constructor.peerChat:
             return TL.inputPeerChat(((PeerChatConstructor) peer).chat_id);
         default:
             throw new Exception("invalid constructor");
     }
 }
예제 #27
0
        /// <summary>
        /// Received handler for listener.
        /// </summary>
        /// <param name="data">The data.</param>
        /// <param name="peerFrom">The peer.</param>
        private void OnReceiveHandler(byte[] data, Peer peerFrom)
        {
            Assert.AreEqual(
                CommonHelper.ByteToString(this.lastData),
                CommonHelper.ByteToString(data));

            Assert.AreEqual(this.lastPeerFrom.IP, peerFrom.IP);

            this.received = true;
        }
예제 #28
0
 public void Setup()
 {
     _listener = new TcpListener(9999);
     _connectedEvent = new ManualResetEvent(false);
     _communicationManager = new CommunicationManager(_listener);
     _communicationManager.PeerConnected += (sender, args) => {
         _peer = args.Peer;
         _connectedEvent.Set();
     };
     _listener.Start();
 }
예제 #29
0
        public void should_throw_exception_if_several_peers_can_handle_a_command()
        {
            var command = new FakeCommand(456);

            var peer1 = new Peer(new PeerId("Abc.Testing.Peer1"), "Peer1Endpoint");
            var peer2 = new Peer(new PeerId("Abc.Testing.Peer2"), "Peer2Endpoint");

            SetupPeersHandlingMessage<FakeCommand>(peer1, peer2);

            _bus.Start();

            Assert.Throws<InvalidOperationException>(() => _bus.Send(command));
        }
예제 #30
0
 public void RemoveListener(Peer peer,uint id)
 {
     if (Listeners.ContainsKey(id))
     {
         peer.OnUnsubscribe(Listeners[id]);
         Listeners[id].Dispose();
         Listeners.Remove(id);
     }
     else
     {
         Logger.WARN("Listener {0} is already unsubscribed of publication {1}",id,PublisherId);
     }
 }
예제 #31
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="peer"></param>
 /// <param name="applicationGuid"></param>
 /// <param name="sampleName"></param>
 public ConnectWizard(Peer peer, Guid application, string sampleName)
 {
     peerObject      = peer;
     applicationGuid = application;
     samplename      = sampleName;
 }
예제 #32
0
        public static Message Parse(
            NetMQMessage raw,
            bool reply,
            AppProtocolVersion localVersion,
            IImmutableSet <PublicKey> trustedAppProtocolVersionSigners,
            DifferentAppProtocolVersionEncountered differentAppProtocolVersionEncountered)
        {
            if (raw.FrameCount == 0)
            {
                throw new ArgumentException("Can't parse empty NetMQMessage.");
            }

            // (reply == true)  [version, type, peer, sign, frames...]
            // (reply == false) [identity, version, type, peer, sign, frames...]
            NetMQFrame[] remains = reply ? raw.ToArray() : raw.Skip(1).ToArray();

            var versionToken = remains[(int)MessageFrame.Version].ConvertToString();

            AppProtocolVersion remoteVersion = AppProtocolVersion.FromToken(versionToken);
            Peer remotePeer = null;

            try
            {
                remotePeer = DeserializePeer(remains[(int)MessageFrame.Peer].ToByteArray());
            }
            catch (Exception)
            {
                // If failed to find out remotePeer, leave it null.
            }

            if (!IsAppProtocolVersionValid(
                    remotePeer,
                    localVersion,
                    remoteVersion,
                    trustedAppProtocolVersionSigners,
                    differentAppProtocolVersionEncountered))
            {
                throw new DifferentAppProtocolVersionException(
                          "Received message's version is not valid.",
                          reply ? null : raw[0].Buffer.ToArray(),
                          localVersion,
                          remoteVersion);
            }

            var rawType = (MessageType)remains[(int)MessageFrame.Type].ConvertToInt32();
            var peer    = remains[(int)MessageFrame.Peer].ToByteArray();

            byte[] signature = remains[(int)MessageFrame.Sign].ToByteArray();

            NetMQFrame[] body = remains.Skip(CommonFrames).ToArray();

            // FIXME: The below code is too repetitive and prone to miss to add, which means,
            // when you add a new message type, you adds an enum member to MessageType and
            // a corresponding subclass of Message, but misses to add that correspondence here,
            // you may take a long time to be aware you've missed here, because the code is still
            // built well and it looks like just Swarm<T> silently ignore new messages.
            // At least this correspondence map should not be here.
            var types = new Dictionary <MessageType, Type>
            {
                { MessageType.Ping, typeof(Ping) },
                { MessageType.Pong, typeof(Pong) },
                { MessageType.GetBlockHashes, typeof(GetBlockHashes) },
                { MessageType.BlockHashes, typeof(BlockHashes) },
                { MessageType.TxIds, typeof(TxIds) },
                { MessageType.GetBlocks, typeof(GetBlocks) },
                { MessageType.GetTxs, typeof(GetTxs) },
                { MessageType.Blocks, typeof(Blocks) },
                { MessageType.Tx, typeof(Tx) },
                { MessageType.FindNeighbors, typeof(FindNeighbors) },
                { MessageType.Neighbors, typeof(Neighbors) },
                { MessageType.GetRecentStates, typeof(GetRecentStates) },
                { MessageType.RecentStates, typeof(RecentStates) },
                { MessageType.BlockHeaderMessage, typeof(BlockHeaderMessage) },
                { MessageType.GetChainStatus, typeof(GetChainStatus) },
                { MessageType.ChainStatus, typeof(ChainStatus) },
                { MessageType.GetBlockStates, typeof(GetBlockStates) },
                { MessageType.BlockStates, typeof(BlockStates) },
                { MessageType.DifferentVersion, typeof(DifferentVersion) },
            };

            if (!types.TryGetValue(rawType, out Type type))
            {
                throw new InvalidMessageException(
                          $"Can't determine NetMQMessage. [type: {rawType}]");
            }

            var message = (Message)Activator.CreateInstance(
                type, new[] { body });

            message.Version = remoteVersion;
            message.Remote  = remotePeer;

            if (!message.Remote.PublicKey.Verify(body.ToByteArray(), signature))
            {
                throw new InvalidMessageException(
                          "The message signature is invalid"
                          );
            }

            if (!reply)
            {
                message.Identity = raw[0].Buffer.ToArray();
            }

            return(message);
        }
예제 #33
0
 public override void Read(BinaryReader reader)
 {
     this.peer         = Tl.Parse <Peer>(reader);
     this.top_message  = reader.ReadInt32();
     this.unread_count = reader.ReadInt32();
 }
예제 #34
0
        /// <summary>
        ///   Creates a new instance of the <see cref="IpfsEngine"/> class.
        /// </summary>
        public IpfsEngine(char[] passphrase)
        {
            this.passphrase = passphrase;

            // Init the core api inteface.
            Bitswap    = new BitswapApi(this);
            Block      = new BlockApi(this);
            Bootstrap  = new BootstrapApi(this);
            Config     = new ConfigApi(this);
            Dag        = new DagApi(this);
            Dht        = new DhtApi(this);
            Dns        = new DnsApi(this);
            FileSystem = new FileSystemApi(this);
            Generic    = new GenericApi(this);
            Key        = new KeyApi(this);
            Name       = new NameApi(this);
            Object     = new ObjectApi(this);
            Pin        = new PinApi(this);
            PubSub     = new PubSubApi(this);
            Stats      = new StatsApi(this);
            Swarm      = new SwarmApi(this);

            // Async properties
            LocalPeer = new AsyncLazy <Peer>(async() =>
            {
                log.Debug("Building local peer");
                var keyChain = await KeyChain();
                log.Debug("Getting key info about self");
                var self                  = await keyChain.FindKeyByNameAsync("self");
                var localPeer             = new Peer();
                localPeer.Id              = self.Id;
                localPeer.PublicKey       = await keyChain.GetPublicKeyAsync("self");
                localPeer.ProtocolVersion = "ipfs/0.1.0";
                var version               = typeof(IpfsEngine).GetTypeInfo().Assembly.GetName().Version;
                localPeer.AgentVersion    = $"net-ipfs/{version.Major}.{version.Minor}.{version.Revision}";
                log.Debug("Built local peer");
                return(localPeer);
            });
            SwarmService = new AsyncLazy <Swarm>(async() =>
            {
                log.Debug("Building swarm service");
                var peer     = await LocalPeer;
                var keyChain = await KeyChain();
                var self     = await keyChain.GetPrivateKeyAsync("self");
                var swarm    = new Swarm
                {
                    LocalPeer    = peer,
                    LocalPeerKey = PeerTalk.Cryptography.Key.CreatePrivateKey(self)
                };
                log.Debug("Built swarm service");
                return(swarm);
            });
            BitswapService = new AsyncLazy <BlockExchange.Bitswap>(async() =>
            {
                log.Debug("Building bitswap service");
                var bitswap = new BlockExchange.Bitswap
                {
                    Swarm        = await SwarmService,
                    BlockService = Block
                };
                log.Debug("Built bitswap service");
                return(bitswap);
            });
            DhtService = new AsyncLazy <PeerTalk.Routing.Dht1>(async() =>
            {
                log.Debug("Building DHT service");
                var dht = new PeerTalk.Routing.Dht1
                {
                    Swarm = await SwarmService
                };
                dht.Swarm.Router = dht;
                log.Debug("Built DHT service");
                return(dht);
            });
        }
예제 #35
0
        public void Add(TorrentManager manager, IConnection connection)
        {
            var peer = new Peer(string.Empty, new Uri("tcp://12.123.123.1:2342"));

            base.RaiseConnectionReceived(peer, connection, manager);
        }
        public void Server_OnPeerConnected(Peer obj)
        {
            Debug.Log("Peer connected!");

            DataController.Instance.applicationState = DataController.ApplicationState.ServerSynchronising;
        }
예제 #37
0
        private void ThreadWorker(Object parameters)
        {
            if (Verbosity > 0)
            {
                Debug.Log("Ignorance Server: Initializing. Please stand by...");
            }

            // Thread cache items
            ThreadParamInfo setupInfo;
            Address         serverAddress = new Address();
            Host            serverENetHost;
            Event           serverENetEvent;

            Peer[] serverPeerArray;
            IgnoranceClientStats peerStats = default;

            // Grab the setup information.
            if (parameters.GetType() == typeof(ThreadParamInfo))
            {
                setupInfo = (ThreadParamInfo)parameters;
            }
            else
            {
                Debug.LogError("Ignorance Server: Startup failure; Invalid thread parameters. Aborting.");
                return;
            }

            // Attempt to initialize ENet inside the thread.
            if (Library.Initialize())
            {
                Debug.Log("Ignorance Server: ENet Native successfully initialized.");
            }
            else
            {
                Debug.LogError("Ignorance Server: Failed to initialize ENet Native. Aborting.");
                return;
            }

            // Configure the server address.
            serverAddress.SetHost(setupInfo.Address);
            serverAddress.Port = (ushort)setupInfo.Port;
            serverPeerArray    = new Peer[setupInfo.Peers];

            using (serverENetHost = new Host())
            {
                // Create the server object.
                try
                {
                    serverENetHost.Create(serverAddress, setupInfo.Peers, setupInfo.Channels);
                }
                catch (Exception ex)
                {
                    Debug.LogError($"Ignorance Server: While attempting to create server host object, we caught an exception:\n{ex.Message}");
                    Debug.LogError($"If you are getting a \"Host creation call failed\" exception, please ensure you don't have a server already running on the same IP and Port.\n" +
                                   $"Multiple server instances running on the same port are not supported. Also check to see if ports are not in-use by another application. In the worse case scenario, " +
                                   $"restart your device to ensure no random background ENet threads are active that haven't been cleaned up correctly. If problems persist, please file a support ticket.");

                    Library.Deinitialize();
                    return;
                }

                // Loop until we're told to cease operations.
                while (!CeaseOperation)
                {
                    // Intermission: Command Handling
                    while (Commands.TryDequeue(out IgnoranceCommandPacket commandPacket))
                    {
                        switch (commandPacket.Type)
                        {
                        default:
                            break;

                        // Boot a Peer off the Server.
                        case IgnoranceCommandType.ServerKickPeer:
                            uint targetPeer = commandPacket.PeerId;

                            if (!serverPeerArray[targetPeer].IsSet)
                            {
                                continue;
                            }

                            if (setupInfo.Verbosity > 0)
                            {
                                Debug.Log($"Ignorance Server: Booting Peer {targetPeer} off");
                            }

                            IgnoranceConnectionEvent iced = new IgnoranceConnectionEvent
                            {
                                EventType    = 0x01,
                                NativePeerId = targetPeer
                            };

                            DisconnectionEvents.Enqueue(iced);

                            // Disconnect and reset the peer array's entry for that peer.
                            serverPeerArray[targetPeer].DisconnectNow(0);
                            serverPeerArray[targetPeer] = default;
                            break;

                        case IgnoranceCommandType.ServerStatusRequest:
                            IgnoranceServerStats serverStats;
                            if (!RecycledServerStatBlocks.TryDequeue(out serverStats))
                            {
                                serverStats.PeerStats = new Dictionary <int, IgnoranceClientStats>(setupInfo.Peers);
                            }

                            serverStats.PeerStats.Clear();

                            serverStats.BytesReceived = serverENetHost.BytesReceived;
                            serverStats.BytesSent     = serverENetHost.BytesSent;

                            serverStats.PacketsReceived = serverENetHost.PacketsReceived;
                            serverStats.PacketsSent     = serverENetHost.PacketsSent;

                            serverStats.PeersCount = serverENetHost.PeersCount;

                            for (int i = 0; i < serverPeerArray.Length; i++)
                            {
                                if (!serverPeerArray[i].IsSet)
                                {
                                    continue;
                                }

                                peerStats.RTT = serverPeerArray[i].RoundTripTime;

                                peerStats.BytesReceived = serverPeerArray[i].BytesReceived;
                                peerStats.BytesSent     = serverPeerArray[i].BytesSent;

                                peerStats.PacketsSent = serverPeerArray[i].PacketsSent;
                                peerStats.PacketsLost = serverPeerArray[i].PacketsLost;

                                serverStats.PeerStats.Add(i, peerStats);
                            }

                            StatusUpdates.Enqueue(serverStats);
                            break;
                        }
                    }

                    // Step One:
                    // ---> Sending to peers
                    while (Outgoing.TryDequeue(out IgnoranceOutgoingPacket outgoingPacket))
                    {
                        // Only create a packet if the server knows the peer.
                        if (serverPeerArray[outgoingPacket.NativePeerId].IsSet)
                        {
                            int ret = serverPeerArray[outgoingPacket.NativePeerId].Send(outgoingPacket.Channel, ref outgoingPacket.Payload);

                            if (ret < 0 && setupInfo.Verbosity > 0)
                            {
                                Debug.LogWarning($"Ignorance Server: ENet error {ret} while sending packet to Peer {outgoingPacket.NativePeerId}.");
                            }
                        }
                        else
                        {
                            // A peer might have disconnected, this is OK - just log the packet if set to paranoid.
                            if (setupInfo.Verbosity > 1)
                            {
                                Debug.LogWarning("Ignorance Server: Can't send packet, a native peer object is not set. This may be normal if the Peer has disconnected before this send cycle.");
                            }
                        }
                    }

                    // Step 2
                    // <--- Receiving from peers
                    bool pollComplete = false;

                    while (!pollComplete)
                    {
                        Packet incomingPacket;
                        Peer   incomingPeer;
                        int    incomingPacketLength;

                        // Any events happening?
                        if (serverENetHost.CheckEvents(out serverENetEvent) <= 0)
                        {
                            // If service time is met, break out of it.
                            if (serverENetHost.Service(setupInfo.PollTime, out serverENetEvent) <= 0)
                            {
                                break;
                            }

                            pollComplete = true;
                        }

                        // Setup the packet references.
                        incomingPeer = serverENetEvent.Peer;

                        // What type are you?
                        switch (serverENetEvent.Type)
                        {
                        // Idle.
                        case EventType.None:
                        default:
                            break;

                        // Connection Event.
                        case EventType.Connect:
                            if (setupInfo.Verbosity > 1)
                            {
                                Debug.Log($"Ignorance Server: Peer ID {incomingPeer.ID} says Hi.");
                            }

                            IgnoranceConnectionEvent ice = new IgnoranceConnectionEvent()
                            {
                                NativePeerId = incomingPeer.ID,
                                IP           = incomingPeer.IP,
                                Port         = incomingPeer.Port
                            };

                            ConnectionEvents.Enqueue(ice);

                            // Assign a reference to the Peer.
                            serverPeerArray[incomingPeer.ID] = incomingPeer;
                            break;

                        // Disconnect/Timeout. Mirror doesn't care if it's either, so we lump them together.
                        case EventType.Disconnect:
                        case EventType.Timeout:
                            if (!serverPeerArray[incomingPeer.ID].IsSet)
                            {
                                break;
                            }

                            if (setupInfo.Verbosity > 1)
                            {
                                Debug.Log($"Ignorance Server: Peer {incomingPeer.ID} has disconnected.");
                            }

                            IgnoranceConnectionEvent iced = new IgnoranceConnectionEvent
                            {
                                EventType    = 0x01,
                                NativePeerId = incomingPeer.ID
                            };

                            DisconnectionEvents.Enqueue(iced);

                            // Reset the peer array's entry for that peer.
                            serverPeerArray[incomingPeer.ID] = default;
                            break;

                        case EventType.Receive:
                            // Receive event type usually includes a packet; so cache its reference.
                            incomingPacket = serverENetEvent.Packet;
                            if (!incomingPacket.IsSet)
                            {
                                if (setupInfo.Verbosity > 0)
                                {
                                    Debug.LogWarning($"Ignorance Server: A receive event did not supply us with a packet to work with. This should never happen.");
                                }
                                break;
                            }

                            incomingPacketLength = incomingPacket.Length;

                            // Firstly check if the packet is too big. If it is, do not process it - drop it.
                            if (incomingPacketLength > setupInfo.PacketSizeLimit)
                            {
                                if (setupInfo.Verbosity > 0)
                                {
                                    Debug.LogWarning($"Ignorance Server: Incoming packet is too big. My limit is {setupInfo.PacketSizeLimit} byte(s) whilest this packet is {incomingPacketLength} bytes.");
                                }

                                incomingPacket.Dispose();
                                break;
                            }

                            IgnoranceIncomingPacket incomingQueuePacket = new IgnoranceIncomingPacket
                            {
                                Channel      = serverENetEvent.ChannelID,
                                NativePeerId = incomingPeer.ID,
                                Payload      = incomingPacket,
                            };

                            // Enqueue.
                            Incoming.Enqueue(incomingQueuePacket);
                            break;
                        }
                    }
                }

                if (Verbosity > 0)
                {
                    Debug.Log("Ignorance Server: Thread shutdown commencing. Flushing connections.");
                }

                // Cleanup and flush everything.
                serverENetHost.Flush();

                // Kick everyone.
                for (int i = 0; i < serverPeerArray.Length; i++)
                {
                    if (!serverPeerArray[i].IsSet)
                    {
                        continue;
                    }
                    serverPeerArray[i].DisconnectNow(0);
                }
            }

            if (setupInfo.Verbosity > 0)
            {
                Debug.Log("Ignorance Server: Shutdown complete.");
            }

            Library.Deinitialize();
        }
예제 #38
0
        public override void SendNextPackets()
        {
            //check sending acks
            if (_mustSendAcks)
            {
                _mustSendAcks = false;
                NetDebug.Write("[RR]SendAcks");
                Monitor.Enter(_outgoingAcks);
                Peer.SendUserData(_outgoingAcks);
                Monitor.Exit(_outgoingAcks);
            }

            long currentTime = DateTime.UtcNow.Ticks;

            Monitor.Enter(_pendingPackets);
            //get packets from queue
            Monitor.Enter(OutgoingQueue);
            while (OutgoingQueue.Count > 0)
            {
                int relate = NetUtils.RelativeSequenceNumber(_localSeqence, _localWindowStart);
                if (relate < _windowSize)
                {
                    PendingPacket pendingPacket = _pendingPackets[_localSeqence % _windowSize];
                    pendingPacket.Sended          = false;
                    pendingPacket.Packet          = OutgoingQueue.Dequeue();
                    pendingPacket.Packet.Sequence = (ushort)_localSeqence;
                    _localSeqence = (_localSeqence + 1) % NetConstants.MaxSequence;
                }
                else //Queue filled
                {
                    break;
                }
            }
            Monitor.Exit(OutgoingQueue);
            //send
            double resendDelay = Peer.ResendDelay;

            for (int pendingSeq = _localWindowStart; pendingSeq != _localSeqence; pendingSeq = (pendingSeq + 1) % NetConstants.MaxSequence)
            {
                PendingPacket currentPacket = _pendingPackets[pendingSeq % _windowSize];
                if (currentPacket.Packet == null)
                {
                    continue;
                }

                if (currentPacket.Sended) //check send time
                {
                    double packetHoldTime = currentTime - currentPacket.TimeStamp;
                    if (packetHoldTime < resendDelay * TimeSpan.TicksPerMillisecond)
                    {
                        continue;
                    }
                    NetDebug.Write("[RC]Resend: {0} > {1}", (int)packetHoldTime, resendDelay);
                }

                currentPacket.TimeStamp = currentTime;
                currentPacket.Sended    = true;
                Peer.SendUserData(currentPacket.Packet);
            }
            Monitor.Exit(_pendingPackets);
        }
예제 #39
0
        //Process incoming packet
        public override void ProcessPacket(NetPacket packet)
        {
            int seq = packet.Sequence;

            if (seq >= NetConstants.MaxSequence)
            {
                NetDebug.Write("[RR]Bad sequence");
                return;
            }

            int relate    = NetUtils.RelativeSequenceNumber(seq, _remoteWindowStart);
            int relateSeq = NetUtils.RelativeSequenceNumber(seq, _remoteSequence);

            if (relateSeq > _windowSize)
            {
                NetDebug.Write("[RR]Bad sequence");
                return;
            }

            //Drop bad packets
            if (relate < 0)
            {
                //Too old packet doesn't ack
                NetDebug.Write("[RR]ReliableInOrder too old");
                return;
            }
            if (relate >= _windowSize * 2)
            {
                //Some very new packet
                NetDebug.Write("[RR]ReliableInOrder too new");
                return;
            }

            //If very new - move window
            int ackIdx;
            int ackByte;
            int ackBit;

            Monitor.Enter(_outgoingAcks);
            if (relate >= _windowSize)
            {
                //New window position
                int newWindowStart = (_remoteWindowStart + relate - _windowSize + 1) % NetConstants.MaxSequence;
                _outgoingAcks.Sequence = (ushort)newWindowStart;

                //Clean old data
                while (_remoteWindowStart != newWindowStart)
                {
                    ackIdx  = _remoteWindowStart % _windowSize;
                    ackByte = NetConstants.SequencedHeaderSize + ackIdx / BitsInByte;
                    ackBit  = ackIdx % BitsInByte;
                    _outgoingAcks.RawData[ackByte] &= (byte)~(1 << ackBit);
                    _remoteWindowStart              = (_remoteWindowStart + 1) % NetConstants.MaxSequence;
                }
            }

            //Final stage - process valid packet
            //trigger acks send
            _mustSendAcks = true;
            ackIdx        = seq % _windowSize;
            ackByte       = NetConstants.SequencedHeaderSize + ackIdx / BitsInByte;
            ackBit        = ackIdx % BitsInByte;
            if ((_outgoingAcks.RawData[ackByte] & (1 << ackBit)) != 0)
            {
                NetDebug.Write("[RR]ReliableInOrder duplicate");
                Monitor.Exit(_outgoingAcks);
                return;
            }

            //save ack
            _outgoingAcks.RawData[ackByte] |= (byte)(1 << ackBit);
            Monitor.Exit(_outgoingAcks);

            //detailed check
            if (seq == _remoteSequence)
            {
                NetDebug.Write("[RR]ReliableInOrder packet succes");
                Peer.AddIncomingPacket(packet);
                _remoteSequence = (_remoteSequence + 1) % NetConstants.MaxSequence;

                if (_ordered)
                {
                    NetPacket p;
                    while ((p = _receivedPackets[_remoteSequence % _windowSize]) != null)
                    {
                        //process holded packet
                        _receivedPackets[_remoteSequence % _windowSize] = null;
                        Peer.AddIncomingPacket(p);
                        _remoteSequence = (_remoteSequence + 1) % NetConstants.MaxSequence;
                    }
                }
                else
                {
                    while (_earlyReceived[_remoteSequence % _windowSize])
                    {
                        //process early packet
                        _earlyReceived[_remoteSequence % _windowSize] = false;
                        _remoteSequence = (_remoteSequence + 1) % NetConstants.MaxSequence;
                    }
                }

                return;
            }

            //holded packet
            if (_ordered)
            {
                _receivedPackets[ackIdx] = packet;
            }
            else
            {
                _earlyReceived[ackIdx] = true;
                Peer.AddIncomingPacket(packet);
            }
        }
예제 #40
0
        //ProcessAck in packet
        public void ProcessAck(NetPacket packet)
        {
            if (packet.Size != _outgoingAcks.Size)
            {
                NetDebug.Write("[PA]Invalid acks packet size");
                return;
            }

            ushort ackWindowStart = packet.Sequence;
            int    windowRel      = NetUtils.RelativeSequenceNumber(_localWindowStart, ackWindowStart);

            if (ackWindowStart >= NetConstants.MaxSequence || windowRel < 0)
            {
                NetDebug.Write("[PA]Bad window start");
                return;
            }

            //check relevance
            if (windowRel >= _windowSize)
            {
                NetDebug.Write("[PA]Old acks");
                return;
            }

            byte[] acksData = packet.RawData;
            Monitor.Enter(_pendingPackets);
            for (int pendingSeq = _localWindowStart; pendingSeq != _localSeqence; pendingSeq = (pendingSeq + 1) % NetConstants.MaxSequence)
            {
                int rel = NetUtils.RelativeSequenceNumber(pendingSeq, ackWindowStart);
                if (rel >= _windowSize)
                {
                    NetDebug.Write("[PA]REL: " + rel);
                    break;
                }

                int pendingIdx  = pendingSeq % _windowSize;
                int currentByte = NetConstants.SequencedHeaderSize + pendingIdx / BitsInByte;
                int currentBit  = pendingIdx % BitsInByte;
                if ((acksData[currentByte] & (1 << currentBit)) == 0)
                {
#if STATS_ENABLED || DEBUG
                    Peer.Statistics.PacketLoss++;
#endif
                    //Skip false ack
                    NetDebug.Write("[PA]False ack: {0}", pendingSeq);
                    continue;
                }
                if (pendingSeq == _localWindowStart)
                {
                    //Move window
                    _localWindowStart = (_localWindowStart + 1) % NetConstants.MaxSequence;
                }

                //clear packet
                var pendingPacket = _pendingPackets[pendingIdx];
                if (pendingPacket.Packet != null)
                {
                    Peer.Recycle(pendingPacket.Packet);
                    pendingPacket.Packet = null;
                    NetDebug.Write("[PA]Removing reliableInOrder ack: {0} - true", pendingSeq);
                }
            }
            Monitor.Exit(_pendingPackets);
        }
예제 #41
0
        public bool HandlePacket(Peer peer, byte[] data)
        {
            var response = new QueryStatus();

            return(_game.PacketHandlerManager.sendPacket(peer, response, Channel.CHL_S2C));
        }
예제 #42
0
 public SendDirectBuilder(Peer peer, PeerConnection peerConnection)
 {
     _peer            = peer;
     RecipientAddress = null;
     PeerConnection   = peerConnection;
 }
예제 #43
0
 public SendDirectBuilder(Peer peer, TcsPeerConnection tcsPeerConnection)
 {
     _peer                  = peer;
     RecipientAddress       = null;
     TcsRecipientConnection = tcsPeerConnection;
 }
        private Channel ReconstructChannel(string name, HFClient client, SampleOrg sampleOrg)
        {
            Util.COut("Reconstructing {0} channel", name);

            client.UserContext = sampleOrg.GetUser(TESTUSER_1_NAME);

            Channel newChannel;

            if (BAR_CHANNEL_NAME.Equals(name))
            {
                // bar channel was stored in samplestore in End2endIT testcase.

                /**
                 *  sampleStore.getChannel uses {@link HFClient#deSerializeChannel(byte[])}
                 */
                newChannel = sampleStore.GetChannel(client, name);

                if (!IS_FABRIC_V10)
                {
                    // Make sure there is one of each type peer at the very least. see End2end for how peers were constructed.
                    Assert.IsFalse(newChannel.GetPeers(new[] { PeerRole.EVENT_SOURCE }).Count == 0);
                    Assert.IsFalse(newChannel.GetPeers(new[] { PeerRole.EVENT_SOURCE }).Count == 0);
                }

                Assert.AreEqual(testConfig.IsFabricVersionAtOrAfter("1.3") ? 0 : 2, newChannel.EventHubs.Count);
                Util.COut("Retrieved channel {0} from sample store.", name);
            }
            else
            {
                newChannel = client.NewChannel(name);

                foreach (string ordererName in sampleOrg.GetOrdererNames())
                {
                    newChannel.AddOrderer(client.NewOrderer(ordererName, sampleOrg.GetOrdererLocation(ordererName), testConfig.GetOrdererProperties(ordererName)));
                }

                bool everyOther = false;

                foreach (string peerName in sampleOrg.GetPeerNames())
                {
                    string      peerLocation        = sampleOrg.GetPeerLocation(peerName);
                    Properties  peerProperties      = testConfig.GetPeerProperties(peerName);
                    Peer        peer                = client.NewPeer(peerName, peerLocation, peerProperties);
                    PeerOptions peerEventingOptions = // we have two peers on one use block on other use filtered
                                                      everyOther ? PeerOptions.CreatePeerOptions().RegisterEventsForBlocks().SetPeerRoles(PeerRole.ENDORSING_PEER, PeerRole.LEDGER_QUERY, PeerRole.CHAINCODE_QUERY, PeerRole.EVENT_SOURCE) : PeerOptions.CreatePeerOptions().RegisterEventsForFilteredBlocks().SetPeerRoles(PeerRole.ENDORSING_PEER, PeerRole.LEDGER_QUERY, PeerRole.CHAINCODE_QUERY, PeerRole.EVENT_SOURCE);

                    newChannel.AddPeer(peer, IS_FABRIC_V10 ? PeerOptions.CreatePeerOptions().SetPeerRoles(PeerRole.ENDORSING_PEER, PeerRole.LEDGER_QUERY, PeerRole.CHAINCODE_QUERY) : peerEventingOptions);

                    everyOther = !everyOther;
                }

                //For testing mix it up. For v1.1 use just peer eventing service for foo channel.
                if (IS_FABRIC_V10)
                {
                    //Should have no peers with event sources.
                    Assert.IsTrue(newChannel.GetPeers(new[] { PeerRole.EVENT_SOURCE }).Count == 0);
                    //Should have two peers with all roles but event source.
                    Assert.AreEqual(2, newChannel.Peers.Count);
                    foreach (string eventHubName in sampleOrg.GetEventHubNames())
                    {
                        EventHub eventHub = client.NewEventHub(eventHubName, sampleOrg.GetEventHubLocation(eventHubName), testConfig.GetEventHubProperties(eventHubName));
                        newChannel.AddEventHub(eventHub);
                    }
                }
                else
                {
                    //Peers should have all roles. Do some sanity checks that they do.

                    //Should have two peers with event sources.
                    Assert.AreEqual(2, newChannel.GetPeers(new[] { PeerRole.EVENT_SOURCE }).Count);
                    //Check some other roles too..
                    Assert.AreEqual(2, newChannel.GetPeers(new[] { PeerRole.CHAINCODE_QUERY, PeerRole.LEDGER_QUERY }).Count);
                    Assert.AreEqual(2, newChannel.GetPeers(PeerRoleExtensions.All()).Count); //really same as newChannel.getPeers()
                }

                Assert.AreEqual(IS_FABRIC_V10 ? sampleOrg.GetEventHubNames().Count : 0, newChannel.EventHubs.Count);
            }

            //Just some sanity check tests
            Assert.IsTrue(newChannel == client.GetChannel(name));
            Assert.IsTrue(client == newChannel.client);
            Assert.AreEqual(name, newChannel.Name);
            Assert.AreEqual(2, newChannel.Peers.Count);
            Assert.AreEqual(1, newChannel.Orderers.Count);
            Assert.IsFalse(newChannel.IsShutdown);
            Assert.IsFalse(newChannel.IsInitialized);
            string serializedChannelBytes = newChannel.Serialize();

            //Just checks if channel can be serialized and deserialized .. otherwise this is just a waste :)
            // Get channel back.

            newChannel.Shutdown(true);
            newChannel = client.DeSerializeChannel(serializedChannelBytes);

            Assert.AreEqual(2, newChannel.Peers.Count);

            Assert.AreEqual(1, newChannel.Orderers.Count);
            Assert.IsNotNull(client.GetChannel(name));
            Assert.AreEqual(newChannel, client.GetChannel(name));
            Assert.IsFalse(newChannel.IsInitialized);
            Assert.IsFalse(newChannel.IsShutdown);
            Assert.AreEqual(TESTUSER_1_NAME, client.UserContext.Name);
            newChannel.Initialize();
            Assert.IsTrue(newChannel.IsInitialized);
            Assert.IsFalse(newChannel.IsShutdown);

            //Begin tests with de-serialized channel.

            //Query the actual peer for which channels it belongs to and check it belongs to this channel
            foreach (Peer peer in newChannel.Peers)
            {
                HashSet <string> channels = client.QueryChannels(peer);
                if (!channels.Contains(name))
                {
                    Assert.Fail($"Peer {peer.Name} does not appear to belong to channel {name}");
                }
            }

            //Just see if we can get channelConfiguration. Not required for the rest of scenario but should work.
            byte[] channelConfigurationBytes = newChannel.GetChannelConfigurationBytes();
            Config channelConfig             = Config.Parser.ParseFrom(channelConfigurationBytes);

            Assert.IsNotNull(channelConfig);

            ConfigGroup channelGroup = channelConfig.ChannelGroup;

            Assert.IsNotNull(channelGroup);

            Dictionary <string, ConfigGroup> groupsMap = channelGroup.Groups.ToDictionary(a => a.Key, a => a.Value);

            Assert.IsNotNull(groupsMap.GetOrNull("Orderer"));

            Assert.IsNotNull(groupsMap.GetOrNull("Application"));

            //Before return lets see if we have the chaincode on the peers that we expect from End2endIT
            //And if they were instantiated too. this requires peer admin user

            client.UserContext = sampleOrg.PeerAdmin;

            foreach (Peer peer in newChannel.Peers)
            {
                if (!CheckInstalledChaincode(client, peer, CHAIN_CODE_NAME, CHAIN_CODE_PATH, CHAIN_CODE_VERSION))
                {
                    Assert.Fail($"Peer {peer.Name} is missing chaincode name: {CHAIN_CODE_NAME}, path:{CHAIN_CODE_PATH}, version: {CHAIN_CODE_VERSION}");
                }

                if (!CheckInstantiatedChaincode(newChannel, peer, CHAIN_CODE_NAME, CHAIN_CODE_PATH, CHAIN_CODE_VERSION))
                {
                    Assert.Fail($"Peer {peer.Name} is missing instantiated chaincode name: {CHAIN_CODE_NAME}, path:{CHAIN_CODE_PATH}, version: {CHAIN_CODE_VERSION}");
                }
            }

            client.UserContext = sampleOrg.GetUser(TESTUSER_1_NAME);

            Assert.IsTrue(newChannel.IsInitialized);
            Assert.IsFalse(newChannel.IsShutdown);

            Util.COut("Finished reconstructing channel {0}.", name);

            return(newChannel);
        }
예제 #45
0
        private static void ClientWorkerThread(ThreadBootstrapStruct startupInfo)
        {
            // Setup...
            uint nextStatsUpdate = 0;

            byte[]  workerPacketBuffer = new byte[startupInfo.maxPacketSize];
            Address cAddress           = new Address();

            // Drain anything in the queues...
            while (MirrorClientIncomingQueue.TryDequeue(out _))
            {
                ;
            }

            while (MirrorClientOutgoingQueue.TryDequeue(out _))
            {
                ;
            }

            // This comment was actually left blank, but now it's not. You're welcome.
            using (Host cHost = new Host())
            {
                try
                {
                    cHost.Create(null, 1, startupInfo.maxChannels, 0, 0, startupInfo.maxPacketSize);
                    ClientStarted = true;
                }
                catch (Exception e)
                {
                    Debug.LogError("Ignorance encountered a fatal exception. To help debug the issue, use a Debug DLL of ENET and look for a 'enet_log.txt' file in the root of your " +
                                   $"application folder.\nIf you believe you found a bug, please report it on the GitHub issue tracker. The exception returned was: {e}");
                    return;
                }

                // Attempt to start connection...
                cAddress.SetHost(startupInfo.hostAddress);
                cAddress.Port = startupInfo.port;
                Peer cPeer = cHost.Connect(cAddress, startupInfo.maxChannels);

                while (!clientShouldCeaseOperation)
                {
                    bool clientWasPolled = false;

                    if (Library.Time >= nextStatsUpdate)
                    {
                        statistics.CurrentPing   = cPeer.RoundTripTime;
                        statistics.BytesReceived = cPeer.BytesReceived;
                        statistics.BytesSent     = cPeer.BytesSent;

                        statistics.PacketsLost = cPeer.PacketsLost;
                        statistics.PacketsSent = cPeer.PacketsSent;

                        // Library.Time is milliseconds, so we need to do some quick math.
                        nextStatsUpdate = Library.Time + (uint)(startupInfo.pingUpdateInterval * 1000);
                    }

                    while (!clientWasPolled)
                    {
                        if (cHost.CheckEvents(out Event networkEvent) <= 0)
                        {
                            if (cHost.Service(startupInfo.threadPumpTimeout, out networkEvent) <= 0)
                            {
                                break;
                            }
                            clientWasPolled = true;
                        }

                        switch (networkEvent.Type)
                        {
                        case EventType.Connect:
                            // Client connected.
                            IncomingPacket connPkt = default;
                            connPkt.type = MirrorPacketType.ClientConnected;
                            MirrorClientIncomingQueue.Enqueue(connPkt);
                            break;

                        case EventType.Timeout:
                        case EventType.Disconnect:
                            // Client disconnected.
                            IncomingPacket disconnPkt = default;
                            disconnPkt.type = MirrorPacketType.ClientDisconnected;
                            MirrorClientIncomingQueue.Enqueue(disconnPkt);
                            break;

                        case EventType.Receive:
                            // Client recieving some data.
                            if (!networkEvent.Packet.IsSet)
                            {
                                print("Ignorance WARNING: A incoming packet is not set correctly.");
                                break;
                            }

                            if (networkEvent.Packet.Length > workerPacketBuffer.Length)
                            {
                                print($"Ignorance: Packet too big to fit in buffer. {networkEvent.Packet.Length} packet bytes vs {workerPacketBuffer.Length} cache bytes {networkEvent.Peer.ID}.");
                                networkEvent.Packet.Dispose();
                                break;
                            }
                            else
                            {
                                // invoke on the client.
                                try
                                {
                                    IncomingPacket dataPkt = default;
                                    dataPkt.type      = MirrorPacketType.ClientGotData;
                                    dataPkt.channelId = networkEvent.ChannelID;

                                    byte[] rentedBuffer = System.Buffers.ArrayPool <byte> .Shared.Rent(networkEvent.Packet.Length);

                                    networkEvent.Packet.CopyTo(rentedBuffer);
                                    dataPkt.data = rentedBuffer;

                                    MirrorClientIncomingQueue.Enqueue(dataPkt);
                                }
                                catch (Exception e)
                                {
                                    Debug.LogError($"Ignorance caught an exception while trying to copy data from the unmanaged (ENET) world to managed (Mono/IL2CPP) world. Please consider reporting this to the Ignorance developer on GitHub.\n" +
                                                   $"Exception returned was: {e.Message}\n" +
                                                   $"Debug details: {(workerPacketBuffer == null ? "packet buffer was NULL" : $"{workerPacketBuffer.Length} byte work buffer")}, {networkEvent.Packet.Length} byte(s) network packet length\n" +
                                                   $"Stack Trace: {e.StackTrace}");
                                    break;
                                }

                                networkEvent.Packet.Dispose();
                            }
                            break;
                        }
                    }
예제 #46
0
 public UnregisterPeerCommand(Peer peer, DateTime?timestampUtc = null)
     : this(peer.Id, peer.EndPoint, timestampUtc)
 {
 }
예제 #47
0
        private void SendToPeer(TransportMessage transportMessage, CodedOutputStream outputStream, Peer target)
        {
            var outboundSocket = GetConnectedOutboundSocket(target, transportMessage);

            if (!outboundSocket.IsConnected)
            {
                return;
            }

            try
            {
                outboundSocket.Send(outputStream.Buffer, outputStream.Position, transportMessage);
            }
            catch (Exception ex)
            {
                _logger.Error($"Failed to send message, PeerId: {target.Id}, EndPoint: {target.EndPoint}, Exception: {ex}");
            }
        }
예제 #48
0
 /// <summary>
 ///   Gets the topics that a peer is interested in
 /// </summary>
 /// <param name="peer">
 ///   The <see cref="Peer"/>.
 /// </param>
 /// <returns>
 ///   A sequence of topics that the <paramref name="peer"/> is
 ///   interested in.
 /// </returns>
 public IEnumerable <string> GetTopics(Peer peer)
 {
     return(_topics
            .Where(kp => kp.Value.Contains(peer))
            .Select(kp => kp.Key));
 }
예제 #49
0
        public override NET_RESULT_DEFINE.PACKET_EXE Execute(PacketBase packet, ref Peer pPlayer)
        {
            //当前流程是主流程
            if (GameProcedure.GetActiveProcedure() == (GameProcedure)GameProcedure.s_ProcMain)
            {
                GCNewPet_Move  pPacket        = (GCNewPet_Move)packet;
                CObjectManager pObjectManager = CObjectManager.Instance;

                //检查位置是否合法
                fVector2 pos = new fVector2(pPacket.getWorldPos().m_fX, pPacket.getWorldPos().m_fZ);
                if (!WorldManager.Instance.ActiveScene.IsValidPosition(ref pos))
                {
                    LogManager.LogError("Valid Position @GCNewPetHandler.Execute");
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_ERROR);
                }

                fVector2 targetPos = new fVector2(pPacket.getTargetPos().m_fX, pPacket.getTargetPos().m_fZ);
                if (!WorldManager.Instance.ActiveScene.IsValidPosition(ref targetPos))
                {
                    LogManager.LogError("Valid Position @GCNewPetHandler.Execute");
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_ERROR);
                }

                //创建宠物
                CObject_PlayerNPC pNPC = (CObject_PlayerNPC)pObjectManager.FindServerObject((int)pPacket.getObjID());


                if (pNPC == null)
                {
                    pNPC = pObjectManager.NewPlayerNPC((int)pPacket.getObjID());

                    SObjectInit initPlayerNPC = new SObjectInit();
                    initPlayerNPC.m_fvPos = new Vector3(pos.x, 0, pos.y);
                    initPlayerNPC.m_fvRot = new Vector3(0.0f, 0.0f, 0.0f);

                    pNPC.Initial(initPlayerNPC);
                }
                else
                {
                    pNPC.SetMapPosition(pos.x, pos.y);
                    pNPC.Enable((uint)ObjectStatusFlags.OSF_VISIABLE);
                    pNPC.Disalbe((uint)ObjectStatusFlags.OSF_OUT_VISUAL_FIELD);
                }
                pNPC.SetNpcType(ENUM_NPC_TYPE.NPC_TYPE_PET);

                pNPC.GetCharacterData().Set_MoveSpeed(pPacket.getMoveSpeed());

                // move to command
                {
                    WORLD_POS[] posTarget = new WORLD_POS[1];
                    posTarget[0].m_fX = pPacket.getTargetPos().m_fX;
                    posTarget[0].m_fZ = pPacket.getTargetPos().m_fZ;

                    SCommand_Object cmdTemp = new SCommand_Object();
                    cmdTemp.m_wID = (int)OBJECTCOMMANDDEF.OC_MOVE;
                    cmdTemp.SetValue <uint>(0, 0);
                    cmdTemp.SetValue <int>(1, pPacket.getHandleID());
                    cmdTemp.SetValue <int>(2, 1);
                    cmdTemp.SetValue <WORLD_POS[]>(3, posTarget);
                    pNPC.PushCommand(cmdTemp);
                }
                //放入Ask队列
                pObjectManager.LoadQueue.TryAddLoadTask(pNPC.ID);
                //同步渲染层
                string szTemp = "GCNewPet_Move(" + pos.x.ToString() + "," + pos.y.ToString() + ")";
                pNPC.PushDebugString(szTemp);
                pNPC.SetMsgTime(GameProcedure.s_pTimeSystem.GetTimeNow());
            }

            return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);;
        }
예제 #50
0
 private void OnConnected(Peer eventPeer)
 {
     ServerConnection = eventPeer;
 }
예제 #51
0
        public static void Main(string[] args)
        {
            var app = new App(new AppProps {
            });

            // can't rely on (incorrect) CDK implementation, so read these files one by one, values from previous may be overridden by those from next
            var ctx = Context.FromJsonFiles(app.Node, $"{OSAgnostic.Home}/cdk.json", $"cdk.json", app.Node.TryGetContext("ctx") as string);

            // Mandatory parameters are not a part of the schema
            var accountNumber = ctx.Resolve("account", "CDK_DEFAULT_ACCOUNT");//, $"Please provide account number: -c account=<number>");

            if (string.IsNullOrWhiteSpace(accountNumber))
            {
                accountNumber = new AmazonSecurityTokenServiceClient().GetCallerIdentityAsync(new GetCallerIdentityRequest()).Result.Account;
                if (string.IsNullOrWhiteSpace(accountNumber))
                {
                    throw new ArgumentException($"No account number returned by AWS STS");
                }
            }
            var regionName = ctx.Resolve("region", "CDK_DEFAULT_REGION", $"Please provide AWS region: -c region=<region>");
            var regionInfo = RegionInfo.Get(regionName);

            Console.WriteLine($"Account: {accountNumber}/{regionInfo?.Name}, {regionInfo?.DomainSuffix}");
            if (string.IsNullOrWhiteSpace(regionInfo?.DomainSuffix))
            {
                throw new ArgumentException($"Invalid region: '{regionName}'");
            }

            var schemaFilePath = ctx.Resolve("schema", help: "Schema file path required: -c schema=<path_to_schema_yaml>");

            Console.WriteLine($"Schema [{schemaFilePath}]");
            IvrSiteSchema schema;

            using (var sr = new StreamReader(schemaFilePath))
            {
                var ext = Path.GetExtension(schemaFilePath).ToLower();
                if (".yaml" == ext)
                {
                    schema = IvrSiteSchema.FromString(System.Environment.ExpandEnvironmentVariables(sr.ReadToEnd()));
                    Console.WriteLine(new YamlDotNet.Serialization.SerializerBuilder().Build().Serialize(schema));
                    if (string.IsNullOrWhiteSpace(schema.SiteName))
                    {
                        var fileName = Path.GetFileNameWithoutExtension(schemaFilePath);
                        schema.SiteName = fileName;
                    }
                }
                else
                {
                    throw new ArgumentException($"Handling of *{ext} format is not implemented (yet)");
                }
                schema.ResolveUndefinedProperties(ctx).Validate().Preprocess();
            }
            var rdpIngressRules = schema.RdpProps.Cidrs.Select(x => new IngressRule(Peer.Ipv4(x.Trim()), Port.Tcp(3389), "RDP").WithDescription($"RDP client"));
            var sipIngressRules = SipProviders.Select(regionInfo.Name, schema.SipProviders, schema.IngressPorts);

            new IvrStack(app, $"IvrStack-{schema.SiteName}".AsCloudFormationId(),
                         new StackProps
            {
                Env = new Amazon.CDK.Environment
                {
                    Account = accountNumber,
                    Region  = regionInfo.Name,
                },
                Tags = schema.Tags,
            },
                         schema,
                         rdpIngressRules.Concat(sipIngressRules)
                         );
            app.Synth();
        }
예제 #52
0
 private void OnDisconnected(Peer eventPeer)
 {
     ServerConnection = new Peer();
 }
예제 #53
0
 public override bool ShouldConnect(Peer peer)
 {
     return(!(peer.IsSeeder && Manager.HasMetadata && Manager.Complete));
 }
예제 #54
0
 public TransferStatusMessage(Peer to) : base(to)
 {
     this.toIp = to.GetIp();
 }
예제 #55
0
 public DialogConstructor(Peer peer, int top_message, int unread_count)
 {
     this.peer         = peer;
     this.top_message  = top_message;
     this.unread_count = unread_count;
 }
예제 #56
0
        public bool HandlePacket(Peer peer, byte[] data, Game game)
        {
            var world = new WorldSendGameNumber(1, game.GetPeerInfo(peer).GetName());

            return(game.PacketHandlerManager.sendPacket(peer, world, Channel.CHL_S2C));
        }
예제 #57
0
 private void OnGUI()
 {
     if (MyInfoManager.Instance.isGuiOn && on)
     {
         VerifyLocalController();
         GUI.skin    = GUISkinFinder.Instance.GetGUISkin();
         GUI.depth   = (int)guiDepth;
         GUI.enabled = !DialogManager.Instance.IsModal;
         GUI.BeginGroup(new Rect(((float)Screen.width - crdFrame.x) / 2f, ((float)Screen.height - crdFrame.y) / 2f, crdFrame.x, crdFrame.y));
         GUI.Box(new Rect(0f, 0f, crdFrame.x, crdFrame.y), string.Empty, "BoxResult");
         Room room = RoomManager.Instance.GetRoom(RoomManager.Instance.CurrentRoom);
         if (room != null)
         {
             LabelUtil.TextOut(crdRoomTitle, room.GetString(), "MiniLabel", Color.white, GlobalVars.txtEmptyColor, TextAnchor.UpperLeft);
         }
         GUI.Box(crdBoxGreen, string.Empty, "BoxGreen02");
         GUI.Box(crdFirstLow, string.Empty, "BoxResultText");
         TextureUtil.DrawTexture(crdIndIcon, indIcon, ScaleMode.StretchToFill);
         LabelUtil.TextOut(new Vector2(markX, resultY), StringMgr.Instance.Get("MARK"), "MiniLabel", Color.white, GlobalVars.txtEmptyColor, TextAnchor.MiddleCenter);
         LabelUtil.TextOut(new Vector2(badgeX, resultY), StringMgr.Instance.Get("BADGE"), "MiniLabel", Color.white, GlobalVars.txtEmptyColor, TextAnchor.MiddleCenter);
         LabelUtil.TextOut(new Vector2(nickX, resultY), StringMgr.Instance.Get("CHARACTER"), "MiniLabel", Color.white, GlobalVars.txtEmptyColor, TextAnchor.MiddleCenter);
         LabelUtil.TextOut(new Vector2(killX, resultY), StringMgr.Instance.Get("KILL") + "/" + StringMgr.Instance.Get("ASSIST") + "/" + StringMgr.Instance.Get("DEATH"), "MiniLabel", Color.white, GlobalVars.txtEmptyColor, TextAnchor.MiddleCenter);
         LabelUtil.TextOut(new Vector2(scoreX, resultY), StringMgr.Instance.Get("SCORE"), "MiniLabel", Color.white, GlobalVars.txtEmptyColor, TextAnchor.MiddleCenter);
         LabelUtil.TextOut(new Vector2(pingX, resultY), StringMgr.Instance.Get("PING"), "MiniLabel", Color.white, GlobalVars.txtEmptyColor, TextAnchor.MiddleCenter);
         float num = yy;
         GUI.Box(crdSituation, string.Empty, "BoxResult01");
         bool flag = false;
         List <KeyValuePair <int, BrickManDesc> > list = BrickManManager.Instance.ToSortedList();
         for (int i = 0; i < list.Count; i++)
         {
             BrickManDesc value = list[i].Value;
             if (value != null && value.Slot < 16)
             {
                 GameObject gameObject = BrickManManager.Instance.Get(value.Seq);
                 if (!(null == gameObject))
                 {
                     TPController component = gameObject.GetComponent <TPController>();
                     if (!(null == component))
                     {
                         if (!flag && (MyInfoManager.Instance.Score > value.Score || (MyInfoManager.Instance.Score == value.Score && MyInfoManager.Instance.Kill > value.Kill)))
                         {
                             flag = true;
                             float num2 = num;
                             num = GridOut(MyInfoManager.Instance.ClanMark, MyInfoManager.Instance.Xp, MyInfoManager.Instance.Rank, MyInfoManager.Instance.Nickname, MyInfoManager.Instance.Kill, MyInfoManager.Instance.Assist, MyInfoManager.Instance.Death, MyInfoManager.Instance.Score, MyInfoManager.Instance.PingTime, MyInfoManager.Instance.Status, localController.IsDead, num, MyInfoManager.Instance.Seq == RoomManager.Instance.Master);
                             GUI.Box(new Rect(myRowX, num2 - myRowSize.y / 2f + 2f, myRowSize.x, myRowSize.y), string.Empty, "BoxMyInfo");
                         }
                         Peer peer = P2PManager.Instance.Get(value.Seq);
                         num = GridOut(value.ClanMark, value.Xp, value.Rank, value.Nickname, value.Kill, value.Assist, value.Death, value.Score, peer?.PingTime ?? float.PositiveInfinity, value.Status, component.IsDead, num, value.Seq == RoomManager.Instance.Master);
                     }
                 }
             }
         }
         if (!flag)
         {
             GridOut(MyInfoManager.Instance.ClanMark, MyInfoManager.Instance.Xp, MyInfoManager.Instance.Rank, MyInfoManager.Instance.Nickname, MyInfoManager.Instance.Kill, MyInfoManager.Instance.Assist, MyInfoManager.Instance.Death, MyInfoManager.Instance.Score, MyInfoManager.Instance.PingTime, MyInfoManager.Instance.Status, localController.IsDead, num, MyInfoManager.Instance.Seq == RoomManager.Instance.Master);
             GUI.Box(new Rect(myRowX, num - myRowSize.y / 2f + 2f, myRowSize.x, myRowSize.y), string.Empty, "BoxMyInfo");
         }
         GUI.EndGroup();
         GUI.enabled = true;
     }
 }
예제 #58
0
 public void SetPeer(Peer peer)
 {
     _peer = peer;
 }
예제 #59
0
 public SendDirectBuilder(Peer peer, PeerAddress peerAddress)
 {
     _peer                  = peer;
     RecipientAddress       = peerAddress;
     TcsRecipientConnection = null;
 }
        private void TestPeerServiceEventingReplay(HFClient client, Channel replayTestChannel, long start, long stop, bool useFilteredBlocks)
        {
            if (testConfig.IsRunningAgainstFabric10())
            {
                return; // not supported for v1.0
            }

            Assert.IsFalse(replayTestChannel.IsInitialized); //not yet initialized
            Assert.IsFalse(replayTestChannel.IsShutdown);    // not yet shutdown.

            //Remove all peers just have one ledger peer and one eventing peer.
            List <Peer> savedPeers = new List <Peer>(replayTestChannel.Peers);

            foreach (Peer peer in savedPeers)
            {
                replayTestChannel.RemovePeer(peer);
            }

            Assert.IsTrue(savedPeers.Count > 1); //need at least two
            Peer eventingPeer = savedPeers[0];

            eventingPeer = client.NewPeer(eventingPeer.Name, eventingPeer.Url, eventingPeer.Properties);
            Peer ledgerPeer = savedPeers[1];

            ledgerPeer = client.NewPeer(ledgerPeer.Name, ledgerPeer.Url, ledgerPeer.Properties);

            savedPeers.RemoveAt(0);
            savedPeers.RemoveAt(0);

            Assert.IsTrue(replayTestChannel.Peers.Count == 0);                                                                 // no more peers.
            Assert.IsTrue(replayTestChannel.GetPeers(new[] { PeerRole.CHAINCODE_QUERY, PeerRole.ENDORSING_PEER }).Count == 0); // just checking :)
            Assert.IsTrue(replayTestChannel.GetPeers(new[] { PeerRole.LEDGER_QUERY }).Count == 0);                             // just checking

            Assert.IsNotNull(client.GetChannel(replayTestChannel.Name));                                                       // should be known by client.

            PeerOptions eventingPeerOptions = PeerOptions.CreatePeerOptions().SetPeerRoles(new List <PeerRole> {
                PeerRole.EVENT_SOURCE
            });

            if (useFilteredBlocks)
            {
                eventingPeerOptions.RegisterEventsForFilteredBlocks();
            }

            if (-1L == stop)
            {
                //the height of the blockchain

                replayTestChannel.AddPeer(eventingPeer, eventingPeerOptions.StartEvents(start)); // Eventing peer start getting blocks from block 0
            }
            else
            {
                replayTestChannel.AddPeer(eventingPeer, eventingPeerOptions.StartEvents(start).StopEvents(stop)); // Eventing peer start getting blocks from block 0
            }

            //add a ledger peer
            replayTestChannel.AddPeer(ledgerPeer, PeerOptions.CreatePeerOptions().SetPeerRoles(new List <PeerRole> {
                PeerRole.LEDGER_QUERY
            }));

            TaskCompletionSource <long> done = new TaskCompletionSource <long>(); // future to set when done.
            // some variable used by the block listener being set up.

            long    bcount       = 0;
            long    stopValue    = stop == -1L ? long.MaxValue : stop;
            Channel finalChannel = replayTestChannel;
            ConcurrentDictionary <long, BlockEvent> blockEvents = new ConcurrentDictionary <long, BlockEvent>();

            string blockListenerHandle = replayTestChannel.RegisterBlockListener((blockEvent) =>
            {
                try
                {
                    long blockNumber = blockEvent.BlockNumber;
                    if (blockEvents.ContainsKey(blockNumber))
                    {
                        Assert.Fail($"Block number {blockNumber} seen twice");
                    }
                    blockEvents[blockNumber] = blockEvent;


                    Assert.IsTrue(useFilteredBlocks ? blockEvent.IsFiltered : !blockEvent.IsFiltered, $"Wrong type of block seen block number {blockNumber}. expected filtered block {useFilteredBlocks} but got {blockEvent.IsFiltered}");
                    long count = Interlocked.Increment(ref bcount) - 1;


                    //out("Block count: %d, block number: %d  received from peer: %s", count, blockNumber, blockEvent.getPeer().getName());

                    if (count == 0 && stop == -1L)
                    {
                        BlockchainInfo blockchainInfo = finalChannel.QueryBlockchainInfo();

                        long lh   = blockchainInfo.Height;
                        stopValue = lh - 1L; // blocks 0L 9L are on chain height 10 .. stop on 9
                        //  out("height: %d", lh);
                        if (Interlocked.Read(ref bcount) + start > stopValue)
                        {
                            // test with latest count.

                            done.SetResult(Interlocked.Read(ref bcount));
                        }
                    }
                    else
                    {
                        if (Interlocked.Read(ref bcount) + start > stopValue)
                        {
                            done.SetResult(count);
                        }
                    }
                }
                catch (System.Exception e)
                {
                    done.SetException(e);
                }
            });


            try
            {
                replayTestChannel.Initialize(); // start it all up.
                done.Task.Wait(30 * 1000);
                Thread.Sleep(1000);             // sleep a little to see if more blocks trickle in .. they should not
                replayTestChannel.UnregisterBlockListener(blockListenerHandle);

                long expectNumber = stopValue - start + 1L; // Start 2 and stop is 3  expect 2

                Assert.AreEqual(expectNumber, blockEvents.Count, $"Didn't get number we expected {expectNumber} but got {blockEvents.Count} block events. Start: {start}, end: {stop}, height: {stopValue}");

                for (long i = stopValue; i >= start; i--)
                {
                    //make sure all are there.
                    BlockEvent blockEvent = blockEvents[i];
                    Assert.IsNotNull(blockEvent, $"Missing block event for block number {i}. Start= {start}", blockEvent);
                }

                //light weight test just see if we get reasonable values for traversing the block. Test just whats common between
                // Block and FilteredBlock.

                int transactionEventCounts = 0;
                int chaincodeEventsCounts  = 0;

                for (long i = stopValue; i >= start; i--)
                {
                    BlockEvent blockEvent = blockEvents[i];
//                out("blockwalker %b, start: %d, stop: %d, i: %d, block %d", useFilteredBlocks, start, stopValue.longValue(), i, blockEvent.getBlockNumber());
                    Assert.AreEqual(useFilteredBlocks, blockEvent.IsFiltered); // check again

                    if (useFilteredBlocks)
                    {
                        Assert.IsNull(blockEvent.Block);            // should not have raw block event.
                        Assert.IsNotNull(blockEvent.FilteredBlock); // should have raw filtered block.
                    }
                    else
                    {
                        Assert.IsNotNull(blockEvent.Block);      // should not have raw block event.
                        Assert.IsNull(blockEvent.FilteredBlock); // should have raw filtered block.
                    }

                    Assert.AreEqual(replayTestChannel.Name, blockEvent.ChannelId);

                    foreach (EnvelopeInfo envelopeInfo in blockEvent.EnvelopeInfos)
                    {
                        if (envelopeInfo.EnvelopeType == EnvelopeType.TRANSACTION_ENVELOPE)
                        {
                            TransactionEnvelopeInfo transactionEnvelopeInfo = (TransactionEnvelopeInfo)envelopeInfo;
                            Assert.IsTrue(envelopeInfo.IsValid); // only have valid blocks.
                            Assert.AreEqual(envelopeInfo.ValidationCode, 0);

                            ++transactionEventCounts;
                            foreach (TransactionActionInfo ta in transactionEnvelopeInfo.TransactionActionInfos)
                            {
                                //    out("\nTA:", ta + "\n\n");
                                ChaincodeEventDeserializer evnt = ta.Event;
                                if (evnt != null)
                                {
                                    Assert.IsNotNull(evnt.ChaincodeId);
                                    Assert.IsNotNull(evnt.EventName);
                                    chaincodeEventsCounts++;
                                }
                            }
                        }
                        else
                        {
                            Assert.AreEqual(blockEvent.BlockNumber, 0, "Only non transaction block should be block 0.");
                        }
                    }
                }

                Assert.IsTrue(transactionEventCounts > 0);

                if (expectNumber > 4)
                {
                    // this should be enough blocks with CC events.

                    Assert.IsTrue(chaincodeEventsCounts > 0);
                }

                replayTestChannel.Shutdown(true); //all done.
            }
            catch (System.Exception e)
            {
                Assert.Fail(e.Message);
            }
        }