• linux下通过网络获取本机时间


    #include<stdio.h>
    
    #include<unistd.h>
    
    #include<sys/socket.h>
    
    #include<netinet/in.h>
    
    #include<netdb.h>
    
     
    
    int main(int argc,char *argv[])
    
    {
    
        char *host;
    
        int sockfd;
    
        int len,result;
    
        struct sockaddr_in address;
    
        struct hostent *hostinfo;
    
        struct servent *servinfo;
    
        char buffer[128];
    
        if(argc == 1)
    
            host = "localhost";
    
        else
    
            host = argv[1];
    
        //get host infomation
    
        hostinfo = gethostbyname(host);
    
        if(!hostinfo){
    
            fprintf(stderr,"no host: %s
    ", host);
    
            exit(1);
    
        }
    
        //get server daytime infomation
    
        servinfo = getservbyname("daytime","tcp");
    
        if(!servinfo){
    
            fprintf(stderr,"no daytime service
    ");
    
            exit(1);
    
        }
    
        printf("daytime port is %d
    ", ntohs(servinfo -> s_port));
    
        //creat a socket 
    
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
    
        //construct a address to 'connet' system call
    
        address.sin_family = AF_INET;
    
        address.sin_port = servinfo -> s_port;
    
        address.sin_addr = *(struct in_addr *)*hostinfo -> h_addr_list;
    
        len = sizeof(address);
    
        //建立连接并取得有关信息
    
        result = connect(sockfd, (struct sockaddr *)&address, len);
    
        if(result == -1){
    
            perror("opps:getdate");
    
            exit(1);
    
        }
    
     
    
        result = read(sockfd, buffer,sizeof(buffer));
    
        buffer[result] = 0;
    
        printf("read %d bytes: %s",result,buffer);
    
        close(sockfd);
    
        exit(0);
    
    }

    本文通过网络获取linux下daytime服务。

           大多数UNIX和linux系统均提供daytime服务,它提供系统的时间和日期。客户端可以连接到daytime这个服务上来查看服务器端的时间和日期。下面是进行的步骤。

            这里用到三个结构体,也是曾经提到的。

            struct sockaddr    //套接字地址结构体

            struct hostent      //客户端信息结构体

            struct servent      //服务端信息结构体

    1、首先获取客户端和服务端的信息

    hostinfo = gethostbyname(host);

    servinfo = getservbyname("daytime","tcp");

    2、建立本地套接字

    sockfd = socket(AF_INET, SOCK_STREAM, 0);    //通过数据流方式创建一个网络套接字

    3、进行套接字地址成员填充

        address.sin_family = AF_INET;    //网络类型

        address.sin_port = servinfo -> s_port; //端口号

        address.sin_addr = *(struct in_addr *)*hostinfo -> h_addr_list;//地址成员列表

        len = sizeof(address);//地址长度

    4、连接到服务端

    result = connect(sockfd, (struct sockaddr *)&address, len);

    5、读取服务端信息

    result = read(sockfd, buffer,sizeof(buffer));

    程序运行结果:

    hello@Aspire-4741:~/program/network/getdate$ ./getdate localhost daytime port is 13 read 26 bytes: 27 JAN 2015 21:19:06 CST

    注意:个人电脑需要开启daytime服务,否则连接请求会被拒绝。至于如何开启,大家可以百度。

    总结:这里仅有客户端而无服务端程序,其实质是客户端和服务端均在个人电脑上,而服务端是隐藏的,或说已经开启了。

    关于daytime服务所处的网络层次讨论,从连接的层面来看,使用了tcp连接,所以这个至少是处理传输层上的协议。但传输层主要是用于网络数据传输的校验以及流量控制,所以不太可能传日期信息到客户端。因此,很可能是网络层上的协议。估计,作为网络层的一个协议可能性比较大,在这里欢迎大家进行补充和指导。

  • 相关阅读:
    DM7 安装
    LeetCode 第 183 场周赛
    MySQL 源码中的 ut_a 、 ut_ad
    存储领域的会议和研究机构
    LeetCode 第 15 场双周赛
    LeetCode 第 167 场周赛
    值得推荐的C/C++框架和库
    InnoDB 中的锁实现
    LeetCode-第 166 场周赛
    LeetCode 第 165 场周赛
  • 原文地址:https://www.cnblogs.com/farbeyond/p/5196827.html
Copyright © 2020-2023  润新知