public static bool exists(string serviceName, bool logFailureReason = false) { string mappedName = Names.Resolve(serviceName); string host = ""; int port = 0; if (ServiceManager.Instance.LookUpService(mappedName, ref host, ref port)) { var transport = new TcpTransport(); if (transport.connect(host, port)) { var m = new Dictionary <string, string> { { "probe", "1" }, { "md5sum", "*" }, { "callerid", ThisNode.Name }, { "service", mappedName } }; var h = new Header(); h.Write(m, out byte[] headerbuf, out int size); byte[] sizebuf = BitConverter.GetBytes(size); transport.write(sizebuf, 0, sizebuf.Length); transport.write(headerbuf, 0, size); return(true); } if (logFailureReason) { ROS.Info()($"[{ThisNode.Name}] waitForService: Service[{mappedName}] could not connect to host [{host}:{port}], waiting..."); } } else if (logFailureReason) { ROS.Info()($"[{ThisNode.Name}] waitForService: Service[{mappedName}] has not been advertised, waiting..."); } return(false); }
private void writeTransport() { lock ( writing ) { if (dropped) { return; } bool can_write_more = true; while (write_callback != null && can_write_more && !dropped) { int to_write = write_size - write_sent; int bytes_sent = transport.write(write_buffer, write_sent, to_write); if (bytes_sent <= 0) { return; } write_sent += (int)bytes_sent; if (bytes_sent < write_size - write_sent) { can_write_more = false; } if (write_sent == write_size && !dropped) { WriteFinishedFunc callback = write_callback; write_callback = null; write_buffer = null; write_sent = 0; write_size = 0; if (!callback(this)) { ROS.Error()($"[{ThisNode.Name}] Failed to invoke {callback.GetMethodInfo().Name}"); } } } } }