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