private static TcpClient r3_publish(OtpLocalNode node)
{
TcpClient s;
try
{
OtpOutputStream obuf = new OtpOutputStream();
s = new TcpClient(node.Host, EpmdPort.get());
obuf.write2BE(node.Alive.Length + 3);
obuf.write1(publish3req);
obuf.write2BE(node.Port);
obuf.writeN(Encoding.GetEncoding("iso-8859-1").GetBytes(node.Alive));
// send request
obuf.WriteTo(s.GetStream());
if (traceLevel >= traceThreshold)
{
log.Debug("-> PUBLISH (r3) " + node + " port=" + node.Port);
}
byte[] tmpbuf = new byte[100];
int n = s.GetStream().Read(tmpbuf, 0, tmpbuf.Length);
if (n < 0)
{
if (traceLevel >= traceThreshold)
{
log.Debug("<- (no response)");
}
return null;
}
OtpInputStream ibuf = new OtpInputStream(tmpbuf, 0);
if (ibuf.read1() == publish3ok)
{
node.Creation = ibuf.read2BE();
if (traceLevel >= traceThreshold)
{
log.Debug("<- OK");
}
return s; // success - don't close socket
}
}
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 (traceLevel >= traceThreshold)
{
log.Debug("<- (no response)");
}
throw new IOException("Nameserver not responding on " + node.Host
+ " when publishing " + node.Alive);
}
catch (OtpErlangDecodeException)
{
if (traceLevel >= traceThreshold)
{
log.Debug("<- (invalid response)");
}
throw new IOException("Nameserver not responding on " + node.Host
+ " when publishing " + node.Alive);
}
return null; // failure
}