private void ProcessLanConnections(object no) { while (run) { List <DetectedNode> localNodes = peerFinder.Peers.ToList(); foreach (DetectedNode peer in localNodes) { if (peer.Address == serverNode.Location) { continue; } //If not already connected to that peer then connect if (extOverlordServers.ToList().Where(o => o.Destination.Location == peer.Address).Count() == 0) { logger.Debug("Server connecting as client to external overlord at {0}", peer.Address); var verb = new ConnectVerb(); verb.Address = serverNode.Location; verb.ClientType = ClientType.Overlord; verb.Secret = IDService.CreateID(); var uplink = new Uplink(model.LocalNode, new Node { ID = peer.OverlordID, Location = peer.Address, NodeType = ClientType.Overlord, Secret = verb.Secret }); extOverlordServers.Add(uplink); var client = new Client(serverNode); if (client.Execute(verb, peer.Address, 5000)) { //Connected as client on an external overlord uplink.OnDisconnect += uplink_OnDisconnect; uplink.Start(); logger.Debug("Server connected to client to external overlord at {0}", peer.Address); break; } else { //Failed to connect ot the external overlord logger.Debug("Server failed to connect to external overlord at {0}", peer.Address); peerFinder.RemovePeer(peer); extOverlordServers.Remove(uplink); } } } Thread.Sleep(3000); } }
private bool Connect(Domain.Entities.Network net, DetectedNode n) { try { LogManager.GetLogger("faplog").Info("Client connecting to {0}", n.Address); net.State = ConnectionState.Connecting; var verb = new ConnectVerb(); verb.ClientType = ClientType.Client; verb.Address = model.LocalNode.Location; verb.Secret = IDService.CreateID(); var client = new Client(model.LocalNode); transmitted.Data.Clear(); foreach (var info in model.LocalNode.Data.ToList()) { transmitted.SetData(info.Key, info.Value); } net.Overlord = new Node(); net.Overlord.Location = n.Address; net.Overlord.Secret = verb.Secret; LogManager.GetLogger("faplog").Debug("Client using secret {0}", verb.Secret); if (client.Execute(verb, n.Address)) { net.State = ConnectionState.Connected; net.Overlord.ID = verb.OverlordID; LogManager.GetLogger("faplog").Info("Client connected"); return(true); } else { net.Overlord = new Node(); } } catch { net.State = ConnectionState.Disconnected; } return(false); }
private bool HandleConnect(NetworkRequest r, RequestEventArgs e) { string address = string.Empty; try { var iv = new ConnectVerb(); iv.ProcessRequest(r); address = iv.Address; if (string.IsNullOrEmpty(iv.Secret)) { //Dont allow connections with no secret return(false); } //Dont allow connections to ourselves.. if (iv.Address == serverNode.Location) { return(false); } //Only allow one connect attempt at once lock (sync) { if (connectingIDs.Contains(address)) { return(false); } connectingIDs.Add(address); } //Connect to the remote client var verb = new InfoVerb(); var client = new Client(serverNode); if (!client.Execute(verb, address)) { return(false); } //Connected ok var c = new ClientStream(); c.OnDisconnect += c_OnDisconnect; Node n = verb.GetValidatedNode(); if (null == n) { return(false); } n.Location = iv.Address; n.Online = true; n.NodeType = iv.ClientType; n.OverlordID = serverNode.ID; n.Secret = iv.Secret; lock (sync) { //Notify other clients var update = new UpdateVerb(); //Was this person already connected? ClientStream search = connectedClientNodes.Where(xn => xn.Node.ID == n.ID).FirstOrDefault(); if (null != search) { connectedClientNodes.Remove(search); search.Kill(); } c.Start(n, serverNode); connectedClientNodes.Add(c); update.Nodes.Add(n); NetworkRequest req = update.CreateRequest(); req.SourceID = serverNode.ID; req.OverlordID = serverNode.ID; req.AuthKey = iv.Secret; SendToStandardClients(req); //Dont send overlord logs to other overlords if (n.NodeType != ClientType.Overlord) { SendToOverlordClients(req); } } //Find client servers ThreadPool.QueueUserWorkItem(ScanClientAsync, n); //return ok //Add headers var headers = e.Response.Headers as HeaderCollection; if (null != headers) { headers.Add("FAP-AUTH", iv.Secret); headers.Add("FAP-SOURCE", serverNode.ID); headers.Add("FAP-OVERLORD", serverNode.ID); } SendResponse(e, null); //Send network info if (n.NodeType == ClientType.Overlord) { var update = new UpdateVerb(); //Only send local nodes foreach ( ClientStream peer in connectedClientNodes.ToList().Where(x => x.Node.NodeType == ClientType.Client)) { update.Nodes.Add(peer.Node); } NetworkRequest req = update.CreateRequest(); req.SourceID = serverNode.ID; req.OverlordID = serverNode.ID; req.AuthKey = iv.Secret; c.AddMessage(req); } else { var update = new UpdateVerb(); //None overlord client. Send local nodes and external ones. update.Nodes = GetBestKnownClientList(); NetworkRequest req = update.CreateRequest(); req.SourceID = serverNode.ID; req.OverlordID = serverNode.ID; req.AuthKey = iv.Secret; c.AddMessage(req); } return(true); } catch { } finally { connectingIDs.Remove(address); } SendError(e); return(false); }