Ejemplo n.º 1
0
        public Node ConnectAsync(OverlayEndpoint theirInfo, Node.DisconnectProcessor dp)
        {
            dp = ProcessDisconnectWrap(dp);
            Node targetNode = FindNode(theirInfo);

            Handshake info = new Handshake(Address, theirInfo, extraHandshakeInfo);

            bool newConnection = (targetNode == null);

            if (newConnection)
            {
                targetNode = new Node(info, processQueue, dp);
                AddNode(targetNode);
            }

            MyAssert.Assert(targetNode.readerStatus != Node.ReadStatus.DISCONNECTED);
            MyAssert.Assert(targetNode.writerStatus != Node.WriteStatus.DISCONNECTED);
            MyAssert.Assert(!targetNode.IsClosed);

            if (targetNode.writerStatus == Node.WriteStatus.WRITING)
            {
                throw new NodeException("Already connected/connecting to " + targetNode.Address);
            }
            else
            {
                targetNode.ConnectAsync();
            }

            if (newConnection)
            {
                onNewConnectionHook.Invoke(targetNode);
            }

            return(targetNode);
        }
Ejemplo n.º 2
0
 public Node TryConnectAsync(OverlayEndpoint theirInfo, Node.DisconnectProcessor dp)
 {
     try
     {
         return(ConnectAsync(theirInfo, dp));
     }
     catch (NodeException)
     {
         return(null);
     }
 }
Ejemplo n.º 3
0
        Node.DisconnectProcessor ProcessDisconnectWrap(Node.DisconnectProcessor disconnectProcessor)
        {
            return((di) =>
            {
                Log.Entry(log, 0, (di.disconnectType == DisconnectType.WRITE_CONNECT_FAIL) ? LogParam.CONSOLE : LogParam.NO_OPTION,
                          "{0} disconnected on {1} ({2})", di.node.info.remote, di.disconnectType, (di.exception == null) ? "" : di.exception.Message);

                RemoveNode(di.node);

                disconnectProcessor(di);
            });
        }
Ejemplo n.º 4
0
 protected void ConnectAsync(OverlayEndpoint addr, Node.DisconnectProcessor dp)
 {
     Host.ConnectAsync(addr, dp);
 }
Ejemplo n.º 5
0
 public NodeProcessors(Node.MessageProcessor message, Node.DisconnectProcessor disconnect)
 {
     this.Message    = message;
     this.Disconnect = disconnect;
 }
Ejemplo n.º 6
0
        static public RemoteAction Send(OverlayHost myHost, OverlayEndpoint remoteHost, Node.DisconnectProcessor dp,
                                        MessageType mt, params object[] args)
        {
            RemoteAction ra = new RemoteAction();

            ra.remoteHost = remoteHost;

            bool assigned = false;

            for (int i = 0; i < args.Length; ++i)
            {
                if (args[i].GetType() == typeof(RemoteActionIdInject))
                {
                    args[i]  = ra.Id;       // id is injected at first RemoteActionIdInject argument
                    assigned = true;
                    break;
                }
            }

            if (!assigned)
            {
                List <object> lst = new List <object>();
                lst.Add(ra.Id);             // or in front if there isn't one
                lst.AddRange(args);
                args = lst.ToArray();
            }

            if (dp != null)
            {
                myHost.TryConnectAsync(remoteHost, dp);
            }
            myHost.SendMessage(remoteHost, mt, args);

            return(ra);
        }