【问题标题】:NTP client for Linux in C++C++ 中用于 Linux 的 NTP 客户端
【发布时间】:2021-11-30 00:02:30
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <netinet/in.h>
#include <iostream>
#include <string>

int main(int argc, char *argv[])
{
    int sock;
    int recvsize;
    char pack[1024];

    struct sockaddr_in sAddr;
    struct hostent *sHost;

    sHost = gethostbyname("time.google.com");
    if(sHost == NULL){
        return 0;
    }

    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    memset(&sAddr, 0, sizeof(sAddr));
    sAddr.sin_family = AF_INET;


    memcpy(&sAddr.sin_addr, sHost->h_addr_list[0], sizeof(sAddr.sin_addr));
    sAddr.sin_port = htons(123);

    if(connect(sock, (struct sockaddr*)&sAddr, sizeof(sAddr)) == -1){
        perror("connect error");
        return -1;
    }

    std::cout << "Connect" << std::endl;

    recvsize = recv(sock, pack, sizeof(pack), 0);

    std::cout << "Get Size:" << recvsize << std::endl;
    std::cout << pack << std::endl;
    
    close(sock);
    return 0;
}

这是我的 ntp 客户端代码。
我尝试连接并从 ntp 服务器获取白天消息。

但是当我运行这段代码时,什么都不会发生。
连接似乎正常工作,似乎没有发生连接失败或超时。

我的环境:
主要操作系统:Windows10
子操作系统:ubuntu20.04 LTS(在 VirtualBox 6.1 中运行)
编译器:g++ 4.8.4

添加说明:
抱歉,我忘记添加标题了。
当这个程序运行时,它显示“连接”。
并且,无需退出即可进入待机模式。不冷。

【问题讨论】:

  • 为什么提供没有标题的样本?发布完整代码有这么难吗?这么多年还是一样……
  • 所以程序结束时没有错误输出成功输出?并且:您是否在调试器中运行了代码?
  • 如果没有人回答,我应该指出代码挂在这一行 "sHost = gethostbyname("time.google.com");"
  • @SChepurin - 此代码是完整的代码。这只是一个确认连接方法的代码。
  • @Peter - 恢复 Monica - 不,程序没有结束。在等待接收时停止。

标签: c++ ubuntu-20.04 ntp


【解决方案1】:

您只是打开一个 UDP 套接字到 NTP 服务器。为了与 NTP 服务器正确交互,您需要实现该协议。

最新版本的 NTP 在RFC5905 中指定。在那里你会找到你需要的所有信息。或者,您可以查看 ntp 项目的 reference implementation

如果您想验证您的代码是否正在创建传出连接,您可以使用netstat -puw | grep 123 进行检查。此命令列出所有传出 UDP 连接并过滤所有不包含 123 的行。在 Ubuntu 上,您需要安装 net-tools 包才能运行此命令。

【讨论】:

  • 我认为OP的问题更基本:他们不确定连接是否已建立。
  • @Peter - Reinstate Monica - “他们不确定连接是否已经建立。” - 手册中的这个示例中的 if(connect) 是什么(他/她肯定复制了它)?
  • 我认为很明显连接已经建立,因为代码正在检查连接错误。我认为问题在于 OP 期望在没有在套接字之上实现协议的情况下发生一些事情。
  • @user2393256 - “我认为很明显已经建立了连接” - 不。他/她不确定它是否按名称获取服务器,但不是。即使确实如此(更正后),也不会创建套接字。
  • 我执行了 netstat 命令,它处于 ESTABLISHED 状态。
猜你喜欢
  • 1970-01-01
  • 2010-10-29
  • 2014-04-12
  • 2014-01-15
  • 1970-01-01
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多