#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\n", host);

        exit(1);

    }

    //get server daytime infomation

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

    if(!servinfo){

        fprintf(stderr,"no daytime service\n");

        exit(1);

    }

    printf("daytime port is %d\n", 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连接,所以这个至少是处理传输层上的协议。但传输层主要是用于网络数据传输的校验以及流量控制,所以不太可能传日期信息到客户端。因此,很可能是网络层上的协议。估计,作为网络层的一个协议可能性比较大,在这里欢迎大家进行补充和指导。

 

posted on 2016-02-17 23:07  farbeyond  阅读(2771)  评论(0编辑  收藏  举报