/** * Intiate and open a connection to a remote node. * * @exception java.io.IOException if it was not possible to connect to the * peer. * * @exception OtpAuthException if handshake resulted in an authentication * error. */ protected AbstractConnection(OtpLocalNode self, OtpPeer other) : base("receive", true) { peer = other; this.self = self; socket = null; int port; traceLevel = defaultLevel; // now get a connection between the two... port = OtpEpmd.lookupPort(peer); // now find highest common dist value if (peer.Proto != self.Proto || self.DistHigh < peer.DistLow || self.DistLow > peer.DistHigh) { throw new IOException("No common protocol found - cannot connect"); } // highest common version: min(peer.distHigh, self.distHigh) peer.DistChoose = peer.DistHigh > self.DistHigh ? self.DistHigh : peer.DistHigh; doConnect(port); name = peer.Node; connected = true; }
/* * find or create a connection to the given node */ public OtpCookedConnection getConnection(String node) { OtpPeer peer = null; OtpCookedConnection conn = null; lock (connections) { // first just try looking up the name as-is if (connections.ContainsKey(node)) { conn = connections[node]; } else { // in case node had no '@' add localhost info and try again peer = new OtpPeer(node); if (connections.ContainsKey(peer.Node)) { conn = connections[peer.Node]; } else { try { conn = new OtpCookedConnection(this, peer); conn.setFlags(flags); addConnection(conn); } catch (Exception e) { /* false = outgoing */ connAttempt(peer.Node, false, e); } } } return conn; } }
/** * Accept an incoming connection from a remote node. Used by {@link * OtpSelf#accept() OtpSelf.accept()} to create a connection based on data * received when handshaking with the peer node, when the remote node is the * connection intitiator. * * @exception java.io.IOException if it was not possible to connect to the * peer. * * @exception OtpAuthException if handshake resulted in an authentication * error */ protected AbstractConnection(OtpLocalNode self, BufferedTcpClient s) : base("receive", true) { this.self = self; peer = new OtpPeer(); socket = s; traceLevel = defaultLevel; if (traceLevel >= handshakeThreshold) { log.Debug("<- ACCEPT FROM " + s.Client.RemoteEndPoint); } // get his info recvName(peer); // now find highest common dist value if (peer.Proto != self.Proto || self.DistHigh < peer.DistLow || self.DistLow > peer.DistHigh) { close(); throw new IOException("No common protocol found - cannot accept connection"); } // highest common version: min(peer.distHigh, self.distHigh) peer.DistChoose = peer.DistHigh > self.DistHigh ? self.DistHigh : peer.DistHigh; doAccept(); name = peer.Node; }
protected void recvName(OtpPeer peer) { String hisname = ""; try { byte[] tmpbuf = read2BytePackage(); OtpInputStream ibuf = new OtpInputStream(tmpbuf, 0); byte[] tmpname; int len = tmpbuf.Length; peer.Type = ibuf.read1(); if (peer.Type != AbstractNode.NTYPE_R6) { throw new IOException("Unknown remote node type"); } peer.DistLow = peer.DistHigh = ibuf.read2BE(); if (peer.DistLow < 5) { throw new IOException("Unknown remote node type"); } peer.Flags = ibuf.read4BE(); tmpname = new byte[len - 7]; ibuf.readN(tmpname); hisname = OtpErlangString.newString(tmpname); // Set the old nodetype parameter to indicate hidden/normal status // When the old handshake is removed, the ntype should also be. if ((peer.Flags & AbstractNode.dFlagPublished) != 0) { peer.Type = AbstractNode.NTYPE_R4_ERLANG; } else { peer.Type = AbstractNode.NTYPE_R4_HIDDEN; } if ((peer.Flags & AbstractNode.dFlagExtendedReferences) == 0) { throw new IOException("Handshake failed - peer cannot handle extended references"); } if ((peer.Flags & AbstractNode.dFlagExtendedPidsPorts) == 0) { throw new IOException("Handshake failed - peer cannot handle extended pids and ports"); } } catch (OtpErlangDecodeException) { throw new IOException("Handshake failed - not enough data"); } int i = hisname.IndexOf('@', 0); peer.Node = hisname; peer.Alive = hisname.Substring(0, i); peer.Host = hisname.Substring(i + 1, hisname.Length - (i + 1)); if (traceLevel >= handshakeThreshold) { log.Debug("<- " + "HANDSHAKE" + " ntype=" + peer.Type + " dist=" + peer.DistHigh + " remote=" + peer); } }
/* * Intiate and open a connection to a remote node. * * @exception java.io.IOException if it was not possible to connect to the * peer. * * @exception OtpAuthException if handshake resulted in an authentication * error. */ // package scope internal OtpConnection(OtpSelf self, OtpPeer other) : base(self, other) { this.self = self; queue = new GenericQueue(); start(); }
/* * Intiate and open a connection to a remote node. * * @exception java.io.IOException if it was not possible to connect to the * peer. * * @exception OtpAuthException if handshake resulted in an authentication * error. */ // package scope internal OtpCookedConnection(OtpNode self, OtpPeer other) : base(self, other) { this.self = self; links = new Links(25); start(); }
/** * Open a connection to a remote node. * * @param other * the remote node to which you wish to connect. * * @return a connection to the remote node. * * @exception java.net.UnknownHostException * if the remote host could not be found. * * @exception java.io.IOException * if it was not possible to connect to the remote node. * * @exception OtpAuthException * if the connection was refused by the remote node. */ public OtpConnection connect(OtpPeer other) { return new OtpConnection(this, other); }