Example #1
0
        private Task <PeerAddress> PingBroadcast(int port)
        {
            var tcsPing  = new TaskCompletionSource <PeerAddress>();
            var bindings = _peer.ConnectionBean.Sender.ChannelClientConfiguration.BindingsOutgoing;
            int size     = bindings.BroadcastAddresses.Count;

            var taskLateJoin = new TcsLateJoin <Task <Message.Message> >(size, 1);

            if (size > 0)
            {
                var taskChannelCreator = _peer.ConnectionBean.Reservation.CreateAsync(size, 0);
                Utils.Utils.AddReleaseListener(taskChannelCreator, tcsPing.Task);
                taskChannelCreator.ContinueWith(taskCc =>
                {
                    if (!taskCc.IsFaulted)
                    {
                        AddPingListener(tcsPing, taskLateJoin);
                        for (int i = 0; i < size; i++)
                        {
                            var broadcastAddress           = bindings.BroadcastAddresses[i];
                            var peerAddress                = new PeerAddress(Number160.Zero, broadcastAddress, port, port);
                            var taskValidBroadcastResponse = _peer.PingRpc.PingBroadcastUdpAsync(peerAddress, taskCc.Result,
                                                                                                 _connectionConfiguration);
                            if (!taskLateJoin.Add(taskValidBroadcastResponse))
                            {
                                break;
                            }
                        }
                    }
                    else
                    {
                        tcsPing.SetException(taskCc.TryGetException());
                    }
                });
            }
            else
            {
                tcsPing.SetException(new TaskFailedException("No broadcast address found. Cannot ping nothing."));
            }
            return(tcsPing.Task);
        }
Example #2
0
 private static void AddPingListener(TaskCompletionSource <PeerAddress> tcsPing, TcsLateJoin <Task <Message.Message> > tcsLateJoin)
 {
     // TODO works?
     // we have one successful reply
     tcsLateJoin.Task.ContinueWith(tlj =>
     {
         if (!tlj.IsFaulted && tcsLateJoin.TasksDone().Count > 0)
         {
             var taskResponse = tcsLateJoin.TasksDone()[0];
             tcsPing.SetResult(taskResponse.Result.Sender);
         }
         else
         {
             tcsPing.SetException(tlj.TryGetException());
         }
     });
 }
Example #3
0
 private static void AddPingListener(TaskCompletionSource<PeerAddress> tcsPing, TcsLateJoin<Task<Message.Message>> tcsLateJoin)
 {
     // TODO works?
     // we have one successful reply
     tcsLateJoin.Task.ContinueWith(tlj =>
     {
         if (!tlj.IsFaulted && tcsLateJoin.TasksDone().Count > 0)
         {
             var taskResponse = tcsLateJoin.TasksDone()[0];
             tcsPing.SetResult(taskResponse.Result.Sender);
         }
         else
         {
             tcsPing.SetException(tlj.TryGetException());
         }
     });
 }
Example #4
0
        private Task<PeerAddress> PingBroadcast(int port)
        {
            var tcsPing = new TaskCompletionSource<PeerAddress>();
            var bindings = _peer.ConnectionBean.Sender.ChannelClientConfiguration.BindingsOutgoing;
            int size = bindings.BroadcastAddresses.Count;

            var taskLateJoin = new TcsLateJoin<Task<Message.Message>>(size, 1);
            if (size > 0)
            {
                var taskChannelCreator = _peer.ConnectionBean.Reservation.CreateAsync(size, 0);
                Utils.Utils.AddReleaseListener(taskChannelCreator, tcsPing.Task);
                taskChannelCreator.ContinueWith(taskCc =>
                {
                    if (!taskCc.IsFaulted)
                    {
                        AddPingListener(tcsPing, taskLateJoin);
                        for (int i = 0; i < size; i++)
                        {
                            var broadcastAddress = bindings.BroadcastAddresses[i];
                            var peerAddress = new PeerAddress(Number160.Zero, broadcastAddress, port, port);
                            var taskValidBroadcastResponse = _peer.PingRpc.PingBroadcastUdpAsync(peerAddress, taskCc.Result,
                                _connectionConfiguration);
                            if (!taskLateJoin.Add(taskValidBroadcastResponse))
                            {
                                break;
                            }
                        }
                    }
                    else
                    {
                        tcsPing.SetException(taskCc.TryGetException());
                    }
                });
            }
            else
            {
                tcsPing.SetException(new TaskFailedException("No broadcast address found. Cannot ping nothing."));
            }
            return tcsPing.Task;
        }