В соединении отказано при подаче времени на chrony через сокет датаграммы UNIX
Пытаюсь скормить время хрону через сокет Unix.
Я взял ссылку на gpsd, чтобы скормить время через сокет Unix.
Я изменил свой файл chrony.conf, как показано ниже:
-> refclock SOCK /var/run/chrony.ttyS0.sock delay 0.0 refid SOCK
Примечание:
оставшийся конфиг такой, какой есть. Я ничего не менял. Также я отключил Интернет от моей системы. Так что chrony не будет подключаться ни к одному серверу NTP.
Я создал клиентскую программу, как показано ниже:
/* start of coding */
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <unistd.h>
#include <bits/types.h>
#include "log.h" // log file
/* reference clock socket path */
const char * SOCK_PATH = "/var/run/chrony.ttyS0.sock";
struct sock_sample
{
/* Time of the measurement (system time) */
struct timeval tv;
/* Offset between the true time and the system time (in seconds) */
double offset;
/* Non-zero if the sample is from a PPS signal, i.e. another source
is needed to obtain seconds */
int pulse;
/* 0 - normal, 1 - insert leap second, 2 - delete leap second */
int leap;
/* Padding, ignored */
int _pad;
/* Protocol identifier (0x534f434b) */
int magic;
};
int main()
{
// create a unix socket structure object
struct sockaddr_un s;
// Socket fd
int sockfd;
// socket file path
const char * path = SOCK_PATH;
// create a socket file descriptor
sockfd = socket(AF_UNIX, SOCK_DGRAM, 0);
if (sockfd < 0)
{
std::string log = "socket() failed";
LOG(LOGLEVEL::ERROR_LOG, log);
return -1;
}
// Set socket family as a unix socket
s.sun_family = AF_UNIX; // AF_UNIX = unix socket
// copy socket file path to unix socket structure
if (snprintf(s.sun_path, sizeof (s.sun_path), "%s", path) >= sizeof (s.sun_path))
{
std::string log = "path " + std::string(path) + " is too long";
LOG(LOGLEVEL::ERROR_LOG, log);
return -1;
}
// conect socket before starting to send data
if (connect(sockfd, (struct sockaddr *)&s, SUN_LEN(&s)) < 0)
{
std::string log = "Could not connect socket" + std::string(strerror(errno));
LOG(LOGLEVEL::ERROR_LOG, log);
return -1;
}
struct sock_sample data;
size_t r = -1;
while(1)
{
data.tv.tv_sec = 12076;
data.offset = 0;
data.pulse = 0;
data.leap = 0;
data._pad = 0;
data.magic = 0x534f434b;
// send data over socket
if((r = send(sockfd,&data,sizeof(data),0)) < 0)
{
std::string log = "could not send the data";
LOG(LOGLEVEL::ERROR_LOG, log);
return -1;
}
std::string log = " Send data = " + std::to_string(sizeof(r));
LOG(LOGLEVEL::INFO_LOG, log);
r = -1;
sleep(10); // every 10 sec it should be again send data to chrony
}
close(sockfd);
return 0;
}
Теперь, после успешной настройки и компиляции клиента.
Я перезапустил хроны.
Когда я пытаюсь запустить свой клиент и пытаюсь подключить свой сокет к chrony, он выдает ошибку: "ОШИБКА: не удалось подключиться к socketConnection отклонено"