Пример #1
0
        //------------------------------------------------------------------------------------------------------------------------
        private void _YPServer_OnNewChannel(Server Server, YPChannel.Channel Channel)
        {
            var id = new LANDiscoverer.RemoteEndpointID()
            {
                IPAddress = Channel.RemoteIdentifier,
                ID = 0,
            };

            lock (RemoteNodes)
            {
                //get or create entry for remote node
                var remInfo = RemoteNodes.TryGetOrDefault(id);
                if (remInfo == null)
                {
                    //create entry for remote node
                    remInfo = new RemoteNode(Node, this)
                    {
                        RemoteEndpointID = id,
                        DiscoveryMessage = null,
                        RemoteNodeKey = default(NodeKey),
                    };

                    //add to discovered remote nodes 
                    RemoteNodes.ForceAdd(id, remInfo);
                }

                //hookevents
                hookNewRemoteNodeEvents(remInfo);

                //setup channel
                remInfo.SetupChannel(Channel);
            }
        }
Пример #2
0
        //------------------------------------------------------------------------------------------------------------------------
        private void Discoverer_OnEndpointMsgRx(YPChannel.Transport.Sockets.LANDiscoverer.RemoteEndpointInfo endpoint, YPChannel.Transport.Sockets.IDiscoveryMessageBase __msg)
        {
            try
            {
                //get valid msg
                var msg = __msg as DiscoveryMessage;
                if (msg == null)
                    return;

                //create remotenodekey
                var rem_nodekey = API.Plegma.NodeKey.FromBytes(msg.NodeKey, 0);
                if (rem_nodekey.IsInvalid)
                    return;

                //examine existing association
                lock (RemoteNodes)
                {
                    var remInfo = RemoteNodes.TryGetOrDefault(endpoint.ID);
                    if (remInfo == null)
                    {
                        //inform
                        DebugEx.TraceLog($"NodeDiscoverer : Discovered new node. (ip:{endpoint.IPAddress} nodekey:{rem_nodekey})");

                        //create entry for remote node
                        remInfo = new RemoteNode(Node, this)
                        {
                            RemoteEndpointID = endpoint.ID,
                            DiscoveryMessage = msg,
                            RemoteNodeKey = rem_nodekey,
                        };
                        //add to discovered remote nodes 
                        RemoteNodes.Add(endpoint.ID, remInfo);

                        //hookevents
                        hookNewRemoteNodeEvents(remInfo);

                        //Start a connection attempt
                        remInfo.StartConnectionTask();

                        //raise event
                        if (OnRemoteNodeDiscovery != null)
                            Task.Run(() => { try { OnRemoteNodeDiscovery?.Invoke(remInfo); } catch (Exception ex) { DebugEx.Assert(ex, "Unhandled exception"); } });
                    }
                    else
                    {
                        //start remote node connection
                        if (!remInfo.IsDisposed &&
                            (remInfo.ClientChannel == null || (remInfo.ClientChannel.State == YPChannel.ChannelStates.Closed && !remInfo.ConnectionTaskRunning)))
                            remInfo.StartConnectionTask();
                    }
                }
            }
            catch (Exception ex) { DebugEx.TraceError(ex, "DiscoveryTaskEntryPoint error"); }
        }