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;
}