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