// Ask epmd to close his end of the connection. // Caller should close his epmd socket as well. // This method is pretty forgiving... /* * Unregister from Epmd. Other nodes wishing to connect will no * longer be able to. * * <p> This method does not report any failures. **/ public static void unPublishPort(OtpLocalNode node) { TcpClient s = null; try { s = new TcpClient(System.Net.Dns.GetHostName(), epmdPort); OtpOutputStream obuf = new OtpOutputStream(); obuf.write2BE(node.getAlive().Length + 1); obuf.write1(stopReq); //UPGRADE_NOTE: This code will be optimized in the future; byte[] tmpBytes; int i; string tmpStr; tmpStr = node.getAlive(); tmpBytes = new byte[tmpStr.Length]; i = 0; while (i < tmpStr.Length) { tmpBytes[i] = (byte)tmpStr[i]; i++; } obuf.writeN(tmpBytes); obuf.writeTo((System.IO.Stream)s.GetStream()); // don't even wait for a response (is there one?) if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("-> UNPUBLISH " + node + " port=" + node.port()); OtpTrace.TraceEvent("<- OK (assumed)"); } } catch (System.Exception) { /*ignore all failures */ } finally { try { if (s != null) { s.Close(); } } catch (System.IO.IOException) { /*ignore close failure */ } s = null; } }
private static int r4_lookupPort(AbstractNode node) { int port = 0; System.Net.Sockets.TcpClient s = null; try { OtpOutputStream obuf = new OtpOutputStream(); s = new System.Net.Sockets.TcpClient(node.host(), epmdPort); // build and send epmd request // length[2], tag[1], alivename[n] (length = n+1) obuf.write2BE(node.getAlive().Length + 1); obuf.write1(port4req); //UPGRADE_NOTE: This code will be optimized in the future; byte[] tmpBytes; int i; string tmpStr; tmpStr = node.getAlive(); tmpBytes = new byte[tmpStr.Length]; i = 0; while (i < tmpStr.Length) { tmpBytes[i] = (byte)tmpStr[i]; i++; } obuf.writeN(tmpBytes); // send request obuf.writeTo((System.IO.Stream)s.GetStream()); if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("-> 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, 100); if (n < 0) { // this was an r3 node => not a failure (yet) if (s != null) { s.Close(); } throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when looking up " + node.getAlive()); } OtpInputStream ibuf = new OtpInputStream(tmpbuf); int response = ibuf.read1(); if (response == port4resp) { int result = ibuf.read1(); if (result == 0) { port = ibuf.read2BE(); node.ntype = ibuf.read1(); node._proto = ibuf.read1(); node._distHigh = ibuf.read2BE(); node._distLow = ibuf.read2BE(); // ignore rest of fields } } } catch (System.IO.IOException) { if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("<- (no response)"); } throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when looking up " + node.getAlive()); } catch (Erlang.Exception) { if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("<- (invalid response)"); } throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when looking up " + node.getAlive()); } catch (System.Net.Sockets.SocketException) { if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("<- (no epmd response)"); } throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when looking up " + node.getAlive()); } finally { try { if (s != null) { s.Close(); } } catch (System.IO.IOException) { /*ignore close errors */ } s = null; } if (traceLevel >= traceThreshold) { if (port == 0) { OtpTrace.TraceEvent("<- NOT FOUND"); } else { OtpTrace.TraceEvent("<- PORT " + port); } } return(port); }
private static int r3_lookupPort(AbstractNode node) { int port = 0; System.Net.Sockets.TcpClient s = null; try { OtpOutputStream obuf = new OtpOutputStream(); s = new System.Net.Sockets.TcpClient(node.host(), epmdPort); // build and send epmd request // length[2], tag[1], alivename[n] (length = n+1) obuf.write2BE(node.getAlive().Length + 1); obuf.write1(port3req); //UPGRADE_NOTE: This code will be optimized in the future; byte[] tmpBytes; int i; string tmpStr; tmpStr = node.getAlive(); tmpBytes = new byte[tmpStr.Length]; i = 0; while (i < tmpStr.Length) { tmpBytes[i] = (byte)tmpStr[i]; i++; } obuf.writeN(tmpBytes); // send request obuf.writeTo((System.IO.Stream)s.GetStream()); if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("-> LOOKUP (r3) " + node); } // receive and decode reply byte[] tmpbuf = new byte[100]; s.GetStream().Read(tmpbuf, 0, 100); OtpInputStream ibuf = new OtpInputStream(tmpbuf); port = ibuf.read2BE(); } catch (System.IO.IOException) { if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("<- (no response)"); } throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when looking up " + node.getAlive()); } catch (Erlang.Exception) { if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("<- (invalid response)"); } throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when looking up " + node.getAlive()); } finally { try { if (s != null) { s.Close(); } } catch (System.IO.IOException) { /*ignore close errors */ } s = null; } if (traceLevel >= traceThreshold) { if (port == 0) { OtpTrace.TraceEvent("<- NOT FOUND"); } else { OtpTrace.TraceEvent("<- PORT " + port); } } return(port); }
// used by send and send_reg (message types with payload) protected internal virtual void do_send(OtpOutputStream header, OtpOutputStream payload) { lock(this) { try { if (traceLevel >= OtpTrace.Type.sendThreshold) { // Need to decode header and output buffer to show trace message! // First make OtpInputStream, then decode. try { Erlang.Object h = (header.getOtpInputStream(5)).read_any(); OtpTrace.TraceEvent("-> " + headerType(h) + " " + h.ToString()); Erlang.Object o = (payload.getOtpInputStream(0)).read_any(); OtpTrace.TraceEvent(" " + o.ToString()); o = null; } catch (Erlang.Exception e) { OtpTrace.TraceEvent(" " + "can't decode output buffer:" + e); } } header.writeTo((System.IO.Stream) socket.GetStream()); payload.writeTo((System.IO.Stream) socket.GetStream()); } catch (System.Net.Sockets.SocketException e) { close(); throw e; } catch (System.IO.IOException e) { close(); throw e; } } }
// used by the other message types protected internal virtual void do_send(OtpOutputStream header) { lock(this) { try { if (traceLevel >= OtpTrace.Type.ctrlThreshold) { try { Erlang.Object h = (header.getOtpInputStream(5)).read_any(); OtpTrace.TraceEvent("-> " + headerType(h) + " " + h); } catch (Erlang.Exception e) { OtpTrace.TraceEvent(" " + "can't decode output buffer: " + e); } } header.writeTo((System.IO.Stream) socket.GetStream()); } catch (System.Net.Sockets.SocketException e) { close(); throw e; } catch (System.IO.IOException e) { close(); throw e; } } }
protected internal virtual void sendChallengeReply(int challenge, byte[] digest) { OtpOutputStream obuf = new OtpOutputStream(); obuf.write2BE(21); obuf.write1(ChallengeReply); obuf.write4BE(challenge); obuf.write(digest); obuf.writeTo((System.IO.Stream) socket.GetStream()); if (traceLevel >= handshakeThreshold) { System.Console.Out.WriteLine("-> " + "HANDSHAKE sendChallengeReply" + " challenge=" + challenge + " digest=" + hex(digest) + " local=" + self); } }
protected internal virtual void sendStatus(System.String status) { OtpOutputStream obuf = new OtpOutputStream(); obuf.write2BE(status.Length + 1); obuf.write1(ChallengeStatus); //UPGRADE_NOTE: This code will be optimized in the future; byte[] tmpBytes; int i; string tmpStr; tmpStr = status; tmpBytes = new byte[tmpStr.Length]; i = 0; while (i < tmpStr.Length) { tmpBytes[i] = (byte) tmpStr[i]; i++; } obuf.write(tmpBytes); obuf.writeTo((System.IO.Stream) socket.GetStream()); if (traceLevel >= OtpTrace.Type.handshakeThreshold) { OtpTrace.TraceEvent("-> " + "HANDSHAKE sendStatus" + " status=" + status + " local=" + self); } }
// used by send and send_reg (message types with payload) protected internal virtual void do_send(OtpOutputStream header, OtpOutputStream payload) { lock(this) { try { if (traceLevel >= OtpTrace.Type.sendThreshold) { // Need to decode header and output buffer to show trace message! // First make OtpInputStream, then decode. try { if (traceLevel >= OtpTrace.Type.wireThreshold) { Erlang.Object h = (header.getOtpInputStream(5)).read_any(); Erlang.Binary hb = header.ToBinary(); Erlang.Binary ob = payload.ToBinary(); System.Text.StringBuilder s = new System.Text.StringBuilder(); s.AppendFormat("-> {0} {1} (header_sz={2}, msg_sz={3})\n" + " Header: {4}\n" + " Msg: {5}", headerType(h), h.ToString(), hb.size(), ob.size(), hb.ToBinaryString(), ob.ToBinaryString()); OtpTrace.TraceEvent(s.ToString()); h = null; hb = null; ob = null; } else { Erlang.Object h = (header.getOtpInputStream(5)).read_any(); OtpTrace.TraceEvent("-> " + headerType(h) + " " + h.ToString()); Erlang.Object o = (payload.getOtpInputStream(0)).read_any(); OtpTrace.TraceEvent(" " + o.ToString()); h = null; o = null; } } catch (Erlang.Exception e) { OtpTrace.TraceEvent(" " + "can't decode output buffer:" + e); } } header.writeTo((System.IO.Stream) socket.GetStream()); payload.writeTo((System.IO.Stream) socket.GetStream()); long written = header.count() + payload.count(); sentBytes += written; sentMsgs++; if (onReadWrite != null) onReadWrite(this, Operation.Write, written, sentBytes, sentMsgs); } catch (System.Exception e) { close(); throw e; } } }
protected internal virtual void sendChallenge(int dist, int flags, int challenge) { OtpOutputStream obuf = new OtpOutputStream(); System.String str = self.node(); obuf.write2BE(str.Length + 11); // 11 bytes + nodename obuf.write1(AbstractNode.NTYPE_R6); obuf.write2BE(dist); obuf.write4BE(flags); obuf.write4BE(challenge); //UPGRADE_NOTE: This code will be optimized in the future; byte[] tmpBytes; int i; string tmpStr; tmpStr = str; tmpBytes = new byte[tmpStr.Length]; i = 0; while (i < tmpStr.Length) { tmpBytes[i] = (byte) tmpStr[i]; i++; } obuf.write(tmpBytes); obuf.writeTo((System.IO.Stream) socket.GetStream()); if (traceLevel >= OtpTrace.Type.handshakeThreshold) { OtpTrace.TraceEvent("-> " + "HANDSHAKE sendChallenge" + " flags=" + flags + " dist=" + dist + " challenge=" + challenge + " local=" + self); } }
private static int r4_lookupPort(AbstractNode node) { int port = 0; System.Net.Sockets.TcpClient s = null; try { OtpOutputStream obuf = new OtpOutputStream(); s = new System.Net.Sockets.TcpClient(node.host(), epmdPort); // build and send epmd request // length[2], tag[1], alivename[n] (length = n+1) obuf.write2BE(node.getAlive().Length + 1); obuf.write1(port4req); //UPGRADE_NOTE: This code will be optimized in the future; byte[] tmpBytes; int i; string tmpStr; tmpStr = node.getAlive(); tmpBytes = new byte[tmpStr.Length]; i = 0; while (i < tmpStr.Length) { tmpBytes[i] = (byte) tmpStr[i]; i++; } obuf.writeN(tmpBytes); // send request obuf.writeTo((System.IO.Stream) s.GetStream()); if (traceLevel >= traceThreshold) System.Console.Out.WriteLine("-> 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, 100); if (n < 0) { // this was an r3 node => not a failure (yet) if (s != null) s.Close(); throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when looking up " + node.getAlive()); } OtpInputStream ibuf = new OtpInputStream(tmpbuf); int response = ibuf.read1(); if (response == port4resp) { int result = ibuf.read1(); if (result == 0) { port = ibuf.read2BE(); node.ntype = ibuf.read1(); node._proto = ibuf.read1(); node._distHigh = ibuf.read2BE(); node._distLow = ibuf.read2BE(); // ignore rest of fields } } } catch (System.IO.IOException) { if (traceLevel >= traceThreshold) System.Console.Out.WriteLine("<- (no response)"); throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when looking up " + node.getAlive()); } catch (Erlang.DecodeException) { if (traceLevel >= traceThreshold) System.Console.Out.WriteLine("<- (invalid response)"); throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when looking up " + node.getAlive()); } finally { try { if (s != null) s.Close(); } catch (System.IO.IOException) { /*ignore close errors */ } s = null; } if (traceLevel >= traceThreshold) { if (port == 0) System.Console.Out.WriteLine("<- NOT FOUND"); else System.Console.Out.WriteLine("<- PORT " + port); } return port; }
/*this function will get an exception if it tries to talk to an r3 * epmd, or if something else happens that it cannot forsee. In both * cases we return an exception (and the caller should try again, using * the r3 protocol). * If we manage to successfully communicate with an r4 epmd, we return * either the socket, or null, depending on the result. */ private static System.Net.Sockets.TcpClient r4_publish(OtpLocalNode node) { System.Net.Sockets.TcpClient s = null; try { OtpOutputStream obuf = new OtpOutputStream(); s = new TcpClient(System.Net.Dns.GetHostName(), epmdPort); obuf.write2BE(node.getAlive().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.getAlive().Length); //UPGRADE_NOTE: This code will be optimized in the future; byte[] tmpBytes; int i; string tmpStr; tmpStr = node.getAlive(); tmpBytes = new byte[tmpStr.Length]; i = 0; while (i < tmpStr.Length) { tmpBytes[i] = (byte) tmpStr[i]; i++; } obuf.writeN(tmpBytes); obuf.write2BE(0); // No extra // send request obuf.writeTo((System.IO.Stream) s.GetStream()); if (traceLevel >= traceThreshold) System.Console.Out.WriteLine("-> PUBLISH (r4) " + node + " port=" + node.port()); // get reply byte[] tmpbuf = new byte[100]; int n = s.GetStream().Read(tmpbuf, 0, 100); if (n < 0) { // this was an r3 node => not a failure (yet) if (s != null) s.Close(); throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when publishing " + node.getAlive()); } OtpInputStream ibuf = new OtpInputStream(tmpbuf); int response = ibuf.read1(); if (response == publish4resp) { int result = ibuf.read1(); if (result == 0) { node._creation = ibuf.read2BE(); if (traceLevel >= traceThreshold) System.Console.Out.WriteLine("<- OK"); return s; // success } } } catch (System.IO.IOException) { // epmd closed the connection = fail if (s != null) s.Close(); if (traceLevel >= traceThreshold) System.Console.Out.WriteLine("<- (no response)"); throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when publishing " + node.getAlive()); } catch (Erlang.DecodeException) { if (s != null) s.Close(); if (traceLevel >= traceThreshold) System.Console.Out.WriteLine("<- (invalid response)"); throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when publishing " + node.getAlive()); } if (s != null) s.Close(); return null; }
private static int r3_lookupPort(AbstractNode node) { int port = 0; System.Net.Sockets.TcpClient s = null; try { OtpOutputStream obuf = new OtpOutputStream(); s = new System.Net.Sockets.TcpClient(node.host(), epmdPort); // build and send epmd request // length[2], tag[1], alivename[n] (length = n+1) obuf.write2BE(node.getAlive().Length + 1); obuf.write1(port3req); //UPGRADE_NOTE: This code will be optimized in the future; byte[] tmpBytes; int i; string tmpStr; tmpStr = node.getAlive(); tmpBytes = new byte[tmpStr.Length]; i = 0; while (i < tmpStr.Length) { tmpBytes[i] = (byte) tmpStr[i]; i++; } obuf.writeN(tmpBytes); // send request obuf.writeTo((System.IO.Stream) s.GetStream()); if (traceLevel >= traceThreshold) System.Console.Out.WriteLine("-> LOOKUP (r3) " + node); // receive and decode reply byte[] tmpbuf = new byte[100]; s.GetStream().Read(tmpbuf, 0, 100); OtpInputStream ibuf = new OtpInputStream(tmpbuf); port = ibuf.read2BE(); } catch (System.IO.IOException) { if (traceLevel >= traceThreshold) System.Console.Out.WriteLine("<- (no response)"); throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when looking up " + node.getAlive()); } catch (Erlang.DecodeException) { if (traceLevel >= traceThreshold) System.Console.Out.WriteLine("<- (invalid response)"); throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when looking up " + node.getAlive()); } finally { try { if (s != null) s.Close(); } catch (System.IO.IOException) { /*ignore close errors */ } s = null; } if (traceLevel >= traceThreshold) { if (port == 0) System.Console.Out.WriteLine("<- NOT FOUND"); else System.Console.Out.WriteLine("<- PORT " + port); } return port; }
// Ask epmd to close his end of the connection. // Caller should close his epmd socket as well. // This method is pretty forgiving... /* * Unregister from Epmd. Other nodes wishing to connect will no * longer be able to. * * <p> This method does not report any failures. **/ public static void unPublishPort(OtpLocalNode node) { TcpClient s = null; try { s = new TcpClient(System.Net.Dns.GetHostName(), epmdPort); OtpOutputStream obuf = new OtpOutputStream(); obuf.write2BE(node.getAlive().Length + 1); obuf.write1(stopReq); //UPGRADE_NOTE: This code will be optimized in the future; byte[] tmpBytes; int i; string tmpStr; tmpStr = node.getAlive(); tmpBytes = new byte[tmpStr.Length]; i = 0; while (i < tmpStr.Length) { tmpBytes[i] = (byte) tmpStr[i]; i++; } obuf.writeN(tmpBytes); obuf.writeTo((System.IO.Stream) s.GetStream()); // don't even wait for a response (is there one?) if (traceLevel >= traceThreshold) { System.Console.Out.WriteLine("-> UNPUBLISH " + node + " port=" + node.port()); System.Console.Out.WriteLine("<- OK (assumed)"); } } catch (System.Exception) { /*ignore all failures */ } finally { try { if (s != null) s.Close(); } catch (System.IO.IOException) { /*ignore close failure */ } s = null; } }
// used by the other message types protected internal virtual void do_send(OtpOutputStream header) { lock(this) { try { if (traceLevel >= ctrlThreshold) { try { Erlang.Object h = (header.getOtpInputStream(5)).read_any(); System.Console.Out.WriteLine("-> " + headerType(h) + " " + h); } catch (Erlang.DecodeException e) { System.Console.Out.WriteLine(" " + "can't decode output buffer: " + e); } } header.writeTo((System.IO.Stream) socket.GetStream()); } catch (System.IO.IOException e) { close(); throw e; } } }
private static System.Net.Sockets.TcpClient r3_publish(OtpLocalNode node) { System.Net.Sockets.TcpClient s = null; try { OtpOutputStream obuf = new OtpOutputStream(); s = new System.Net.Sockets.TcpClient(System.Net.Dns.GetHostName(), epmdPort); obuf.write2BE(node.getAlive().Length + 3); obuf.write1(publish3req); obuf.write2BE(node.port()); //UPGRADE_NOTE: This code will be optimized in the future; byte[] tmpBytes; int i; string tmpStr; tmpStr = node.getAlive(); tmpBytes = new byte[tmpStr.Length]; i = 0; while (i < tmpStr.Length) { tmpBytes[i] = (byte)tmpStr[i]; i++; } obuf.writeN(tmpBytes); // send request obuf.writeTo((System.IO.Stream)s.GetStream()); if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("-> PUBLISH (r3) " + node + " port=" + node.port()); } byte[] tmpbuf = new byte[100]; int n = s.GetStream().Read(tmpbuf, 0, 100); if (n < 0) { if (s != null) { s.Close(); } if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("<- (no response)"); } return(null); } OtpInputStream ibuf = new OtpInputStream(tmpbuf); if (ibuf.read1() == publish3ok) { node._creation = ibuf.read2BE(); if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("<- OK"); } return(s); // success - don't close socket } } catch (System.IO.IOException) { // epmd closed the connection = fail if (s != null) { s.Close(); } if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("<- (no response)"); } throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when publishing " + node.getAlive()); } catch (Erlang.Exception) { if (s != null) { s.Close(); } if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("<- (invalid response)"); } throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when publishing " + node.getAlive()); } if (s != null) { s.Close(); } return(null); // failure }
protected internal virtual void sendChallengeAck(byte[] digest) { OtpOutputStream obuf = new OtpOutputStream(); obuf.write2BE(17); obuf.write1(ChallengeAck); obuf.write(digest); obuf.writeTo((System.IO.Stream) socket.GetStream()); if (traceLevel >= OtpTrace.Type.handshakeThreshold) { OtpTrace.TraceEvent("-> " + "HANDSHAKE sendChallengeAck" + " digest=" + hex(digest) + " local=" + self); } }
/*this function will get an exception if it tries to talk to an r3 * epmd, or if something else happens that it cannot forsee. In both * cases we return an exception (and the caller should try again, using * the r3 protocol). * If we manage to successfully communicate with an r4 epmd, we return * either the socket, or null, depending on the result. */ private static System.Net.Sockets.TcpClient r4_publish(OtpLocalNode node) { System.Net.Sockets.TcpClient s = null; System.Exception error = null; try { OtpOutputStream obuf = new OtpOutputStream(); s = new TcpClient(System.Net.Dns.GetHostName(), epmdPort); obuf.write2BE(node.getAlive().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.getAlive().Length); //UPGRADE_NOTE: This code will be optimized in the future; byte[] tmpBytes; int i; string tmpStr; tmpStr = node.getAlive(); tmpBytes = new byte[tmpStr.Length]; i = 0; while (i < tmpStr.Length) { tmpBytes[i] = (byte)tmpStr[i]; i++; } obuf.writeN(tmpBytes); obuf.write2BE(0); // No extra // send request obuf.writeTo((System.IO.Stream)s.GetStream()); if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("-> PUBLISH (r4) " + node + " port=" + node.port()); } // get reply byte[] tmpbuf = new byte[100]; int n = s.GetStream().Read(tmpbuf, 0, 100); if (n < 0) { // this was an r3 node => not a failure (yet) if (s != null) { s.Close(); } throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when publishing " + node.getAlive()); } OtpInputStream ibuf = new OtpInputStream(tmpbuf); int response = ibuf.read1(); if (response == publish4resp) { int result = ibuf.read1(); if (result == 0) { node._creation = ibuf.read2BE(); if (traceLevel >= traceThreshold) { OtpTrace.TraceEvent("<- OK"); } return(s); // success } } } catch (System.IO.IOException e) { error = e; } catch (Erlang.Exception e) { error = e; } catch (System.Net.Sockets.SocketException e) { error = e; } if (error == null) { return(s); } else { // epmd closed the connection = fail if (s != null) { s.Close(); } if (traceLevel >= traceThreshold) { System.Console.Out.WriteLine("<- (no response)"); } string err = "Nameserver not responding on " + node.host() + " when publishing " + node.getAlive(); node.epmdFailedConnAttempt(node.node(), err); if (traceLevel >= traceThreshold) { System.Console.Out.WriteLine("Failed to connect to empd daemon!"); } if (!OtpLocalNode.ignoreLocalEpmdConnectErrors) { throw new System.Exception(err); } node._creation = 0; return(null); } }
private static System.Net.Sockets.TcpClient r3_publish(OtpLocalNode node) { System.Net.Sockets.TcpClient s = null; try { OtpOutputStream obuf = new OtpOutputStream(); s = new System.Net.Sockets.TcpClient(System.Net.Dns.GetHostName(), epmdPort); obuf.write2BE(node.getAlive().Length + 3); obuf.write1(publish3req); obuf.write2BE(node.port()); //UPGRADE_NOTE: This code will be optimized in the future; byte[] tmpBytes; int i; string tmpStr; tmpStr = node.getAlive(); tmpBytes = new byte[tmpStr.Length]; i = 0; while (i < tmpStr.Length) { tmpBytes[i] = (byte) tmpStr[i]; i++; } obuf.writeN(tmpBytes); // send request obuf.writeTo((System.IO.Stream) s.GetStream()); if (traceLevel >= traceThreshold) OtpTrace.TraceEvent("-> PUBLISH (r3) " + node + " port=" + node.port()); byte[] tmpbuf = new byte[100]; int n = s.GetStream().Read(tmpbuf, 0, 100); if (n < 0) { if (s != null) s.Close(); if (traceLevel >= traceThreshold) OtpTrace.TraceEvent("<- (no response)"); return null; } OtpInputStream ibuf = new OtpInputStream(tmpbuf); if (ibuf.read1() == publish3ok) { node._creation = ibuf.read2BE(); if (traceLevel >= traceThreshold) OtpTrace.TraceEvent("<- OK"); return s; // success - don't close socket } } catch (System.IO.IOException) { // epmd closed the connection = fail if (s != null) s.Close(); if (traceLevel >= traceThreshold) OtpTrace.TraceEvent("<- (no response)"); throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when publishing " + node.getAlive()); } catch (Erlang.Exception) { if (s != null) s.Close(); if (traceLevel >= traceThreshold) OtpTrace.TraceEvent("<- (invalid response)"); throw new System.IO.IOException("Nameserver not responding on " + node.host() + " when publishing " + node.getAlive()); } if (s != null) s.Close(); return null; // failure }