【问题标题】:Ntp server not responding to my clientNtp 服务器没有响应我的客户端
【发布时间】:2018-01-13 21:47:07
【问题描述】:

我写了一个非常小的ntp客户端,但是发送数据包后我没有收到服务器的响应,我已经用tcpdump确认了。

我定义了一个结构体,用来传输ntp数据包。

struct NtpMessage_t {
    unsigned int first_line;
    unsigned int root_delay;
    unsigned int root_dispertion;
    unsigned int ref_id;
    unsigned long long ref_timestamp;
    unsigned long long origin_timestamp;
    unsigned long long receive_timestamp;
    unsigned long long transmit_timestamp;
};

message->first_line = 0b00100011000000000000000000000000; 填充数据包后,我将数据包发送到de.ntp.pool.org,但我没有收到回复。套接字初始化和消息的发送和接收通过以下代码完成:

for (i = result; i != NULL; i = i->ai_next) {
    cfd = socket(i->ai_family, i->ai_socktype, i->ai_protocol);

    if (cfd != -1) 
        break;
}

if (i == NULL) {
    fprintf(stderr, "Failed to create socket\n");
    exit(EXIT_FAILURE);
}

NtpMessage *message = calloc(1, sizeof(NtpMessage));
message->first_line = 0b00100011000000000000000000000000;
if (sendto(cfd, message, sizeof(NtpMessage), 0, (struct sockaddr *) i->ai_addr, i->ai_addrlen) < 0) {
    printf("Send failure: %s\n", strerror(errno));
    exit(EXIT_FAILURE);
}

if (recvfrom(cfd, message, sizeof(NtpMessage), 0, (struct sockaddr *) &from_addr, &from_addr_len) < 0) {
    printf("Receive failure: %s\n", strerror(errno));
    exit(EXIT_FAILURE);
}

Tcpdump 为我提供以下输出,据我了解,我的消息已正确发送,但未收到任何答复:

MY_IP_ADDR.50318 > 64.99.80.121.123: [udp sum ok] NTPv0, length 48
unspecified, Leap indicator:  (0), Stratum 0 (unspecified), poll 0 (1s), precision 35
Root Delay: 0.000000, Root dispersion: 0.000000, Reference-ID: (unspec)
  Reference Timestamp:  0.000000000
  Originator Timestamp: 0.000000000
  Receive Timestamp:    0.000000000
  Transmit Timestamp:   0.000000000
    Originator - Receive Timestamp:  0.000000000
    Originator - Transmit Timestamp: 0.000000000

既然没有其他方向的消息,那就意味着没有回应,如果我没记错的话。是这样吗?如果是,这里出了什么问题?我的代码有问题吗?

【问题讨论】:

  • 您真的将数据报发送到de.ntp.pool.org 吗?如果是这样,请尝试将其发送到 de.pool.ntp.org。但是如果你要发送大量这样的数据报,你应该找到一个更本地的 NTP 服务器(或设置你自己的)而不是纠缠池服务器。就数据报本身而言,您在精度字段中有一个非法值。此外,直接在线发送 C 结构也不是一个好主意。编译器可能会在成员之间插入填充,并且多字节字段的字节序可能不正确。
  • 非常感谢您的帮助。我尝试了很多 ntp 服务器,但没有一个工作。其次,如果我不发送结构本身,我应该怎么做?

标签: c sockets ntp


【解决方案1】:

服务器不向您的 ntp 数据包发出响应的原因可能有很多。我看到您在示例中隐藏了几件事,因此问题很可能是对 NTP 协议规范的无知。

如何填写数据包内容?您是否检查过编译器备用字节以填充结构对齐的孔?您是否考虑到,在 NTP 协议中,所有短、int 和 64 位时间戳都必须按网络字节顺序排列(最高有效字节在前)????

最后,NTP 服务器通过忽略传入的数据包来处理不正确的输入,但您假设数据包是正确的。

【讨论】:

    猜你喜欢
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    相关资源
    最近更新 更多