В соединении отказано при подаче времени на 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 отклонено"

0 ответов

Другие вопросы по тегам