private static TcpClient r4_publish(OtpLocalNode node)
{
TcpClient s = null;
try
{
OtpOutputStream obuf = new OtpOutputStream();
s = new TcpClient(node.Host, EpmdPort.get());
obuf.write2BE(node.Alive.Length + 13);
obuf.write1(publish4req);
obuf.write2BE(node.Port);
obuf.write1(node.Type);
obuf.write1(node.Proto);
obuf.write2BE(node.DistHigh);
obuf.write2BE(node.DistLow);
obuf.write2BE(node.Alive.Length);
obuf.writeN(Encoding.GetEncoding("iso-8859-1").GetBytes(node.Alive));
obuf.write2BE(0); // No extra
// send request
obuf.WriteTo(s.GetStream());
if (traceLevel >= traceThreshold)
{
log.Debug("-> PUBLISH (r4) " + node + " port=" + node.Port);
}
// get reply
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)
if (s != null)
{
s.Close();
}
throw new IOException("Nameserver not responding on "
+ node.Host + " when publishing " + node.Alive);
}
OtpInputStream ibuf = new OtpInputStream(tmpbuf, 0);
int response = ibuf.read1();
if (response == publish4resp)
{
int result = ibuf.read1();
if (result == 0)
{
node.Creation = ibuf.read2BE();
if (traceLevel >= traceThreshold)
{
log.Debug("<- OK");
}
return s; // success
}
}
}
catch (SocketException)
{
if (traceLevel >= traceThreshold)
{
log.Debug("<- (no response)");
}
throw new IOException("Nameserver not responding on " + node.Host);
}
catch (IOException)
{
// epmd closed the connection = fail
if (s != null)
{
s.Close();
}
if (traceLevel >= traceThreshold)
{
log.Debug("<- (no response)");
}
throw new IOException("Nameserver not responding on " + node.Host
+ " when publishing " + node.Alive);
}
catch (OtpErlangDecodeException)
{
if (s != null)
{
s.Close();
}
if (traceLevel >= traceThreshold)
{
log.Debug("<- (invalid response)");
}
throw new IOException("Nameserver not responding on " + node.Host
+ " when publishing " + node.Alive);
}
if (s != null)
{
s.Close();
}
return null;
}