//------------------------------------------------------------------------------------------------------------------------ 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); } }
//------------------------------------------------------------------------------------------------------------------------ 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"); } }