private static int r3_lookupPort(AbstractNode node) { int port = 0; try { OtpOutputStream obuf = new OtpOutputStream(); using (TcpClient s = new TcpClient(node.Host, EpmdPort.get())) { // build and send epmd request // length[2], tag[1], alivename[n] (length = n+1) obuf.write2BE(node.Alive.Length + 1); obuf.write1(port3req); obuf.writeN(Encoding.GetEncoding("iso-8859-1").GetBytes(node.Alive)); // send request obuf.WriteTo(s.GetStream()); if (traceLevel >= traceThreshold) { log.Debug("-> LOOKUP (r3) " + node); } // receive and decode reply byte[] tmpbuf = new byte[100]; s.GetStream().Read(tmpbuf, 0, tmpbuf.Length); OtpInputStream ibuf = new OtpInputStream(tmpbuf, 0); port = ibuf.read2BE(); } } catch (SocketException) { if (traceLevel >= traceThreshold) { log.Debug("<- (no response)"); } throw new IOException("Nameserver not responding on " + node.Host); } catch (IOException) { if (traceLevel >= traceThreshold) { log.Debug("<- (no response)"); } throw new IOException("Nameserver not responding on " + node.Host + " when looking up " + node.Alive); } catch (OtpErlangDecodeException) { if (traceLevel >= traceThreshold) { log.Debug("<- (invalid response)"); } throw new IOException("Nameserver not responding on " + node.Host + " when looking up " + node.Alive); } if (traceLevel >= traceThreshold) { if (port == 0) { log.Debug("<- NOT FOUND"); } else { log.Debug("<- PORT " + port); } } return port; }
private static int r4_lookupPort(AbstractNode node) { int port = 0; try { OtpOutputStream obuf = new OtpOutputStream(); using (TcpClient s = new TcpClient(node.Host, EpmdPort.get())) { // build and send epmd request // length[2], tag[1], alivename[n] (length = n+1) obuf.write2BE(node.Alive.Length + 1); obuf.write1(port4req); obuf.writeN(Encoding.GetEncoding("iso-8859-1").GetBytes(node.Alive)); // send request obuf.WriteTo(s.GetStream()); if (traceLevel >= traceThreshold) { log.Debug("-> LOOKUP (r4) " + node); } // receive and decode reply // resptag[1], result[1], port[2], ntype[1], proto[1], // disthigh[2], distlow[2], nlen[2], alivename[n], // elen[2], edata[m] byte[] tmpbuf = new byte[100]; int n = s.GetStream().Read(tmpbuf, 0, tmpbuf.Length); if (n < 0) { // this was an r3 node => not a failure (yet) throw new IOException("Nameserver not responding on " + node.Host + " when looking up " + node.Alive); } OtpInputStream ibuf = new OtpInputStream(tmpbuf, 0); int response = ibuf.read1(); if (response == port4resp) { int result = ibuf.read1(); if (result == 0) { port = ibuf.read2BE(); node.Type = ibuf.read1(); node.Proto = ibuf.read1(); node.DistHigh = ibuf.read2BE(); node.DistLow = ibuf.read2BE(); // ignore rest of fields } } } } catch (SocketException) { if (traceLevel >= traceThreshold) { log.Debug("<- (no response)"); } throw new IOException("Nameserver not responding on " + node.Host); } catch (IOException) { if (traceLevel >= traceThreshold) { log.Debug("<- (no response)"); } throw new IOException("Nameserver not responding on " + node.Host + " when looking up " + node.Alive); } catch (OtpErlangDecodeException) { if (traceLevel >= traceThreshold) { log.Debug("<- (invalid response)"); } throw new IOException("Nameserver not responding on " + node.Host + " when looking up " + node.Alive); } if (traceLevel >= traceThreshold) { if (port == 0) { log.Debug("<- NOT FOUND"); } else { log.Debug("<- PORT " + port); } } return port; }
/** * Determine what port a node listens for incoming connections on. * * @return the listen port for the specified node, or 0 if the node was not * registered with Epmd. * * @exception java.io.IOException * if there was no response from the name server. */ public static int lookupPort(AbstractNode node) { try { return r4_lookupPort(node); } catch (IOException) { return r3_lookupPort(node); } }