Mercurial > hg > fxanalyse
view sr-data-logger.c @ 258:5296f3bcd160
Implement DDS clients reconnect
On network send() failures try to reconnect to the server before
returning an error. This allows to restart the network servers
controlling the DDSes wiothout having to restart the clients.
author | Daniele Nicolodi <daniele.nicolodi@obspm.fr> |
---|---|
date | Tue, 16 Jun 2015 14:31:35 +0200 |
parents | 97112b45b838 |
children |
line wrap: on
line source
#include <ansi_c.h> #include <utility.h> #include <inifile.h> #include <tcpsupp.h> #include "config.h" #include "logging.h" #include "sr-data-logger.h" #define CONF_SECTION_NAME "Sr data logger" int sr_datalogger_init(struct datalogger *dl) { int rv; char path[MAX_PATHNAME_LEN]; /* load configuration file */ GetIniFilePath(path); IniText c = Ini_New(TRUE); Ini_ReadFromFile(c, path); /* read configuration */ rv = Ini_GetStringCopy(c, CONF_SECTION_NAME, "id", &(dl->id)); if (rv <= 0) return -1; rv = Ini_GetStringCopy(c, CONF_SECTION_NAME, "host", &(dl->host)); if (rv <= 0) return -1; rv = Ini_GetInt(c, CONF_SECTION_NAME, "port", &(dl->port)); if (rv <= 0) return -1; /* dispose configuration */ Ini_Dispose(c); return 0; } void sr_datalogger_dispose(struct datalogger *dl) { DisconnectFromTCPServer(dl->sock); free(dl->host); free(dl->id); } static int sr_datalogger_connect(struct datalogger *dl) { return ConnectToTCPServer(&(dl->sock), dl->port, dl->host, NULL, NULL, 1); } /* MJD functiom used by the Sr programs */ static inline double utc2mjd(double utc) { return 15020.0 + utc / 86400.0; } int __sr_datalogger_send(struct datalogger *dl, double utc, double data) { int rv; char buffer[1024]; /* connect */ if (! dl->sock) { rv = sr_datalogger_connect(dl); if (rv < 0) return rv; logmessage(INFO, "connected to Sr data logger %s:%d", dl->host, dl->port); } snprintf(buffer, sizeof(buffer), "%s %.7f %.8f", dl->id, utc2mjd(utc), data); rv = ClientTCPWrite(dl->sock, buffer, strlen(buffer) + 1, 0); if (rv < 0) { /* reconnect and resend */ dl->sock = 0; __sr_datalogger_send(dl, utc, data); } return 0; }