86-时间获取客户端
来源:互联网 发布:网络gb是什么意思啊 编辑:程序博客网 时间:2024/06/06 05:13
本文来一点比较轻松的话题,来写一个客户端,从时间服务器(daytime server) 上取得时间并打印。
1. daytime 服务器
daytime 服务器我们不用自己写了,这个网站列举了很多现成的 daytime 服务器地址:http://tf.nist.gov/tf-cgi/servers.cgi , 剩下的事情我们就只管写客户端。
daytime 服务器使用的是 TCP 协议,默认端口是 13。
目前测得可用的 daytime 服务器有下面几个(不同时间段可能会不一样):
sttime.carsoncity.k12.mi.uswwv.nist.gov time.nist.gov utcnist.colorado.edutime-d.nist.gov
其它的服务器在网络状况好的情况下可以访问,差的情况下也总是出现连接超时的情况。具体看网络环境吧。
2. 时间获取客户端
非常简单,客户端连接上 daytime 服务器后,直接从套接字 read 就行了,然后将读取到的数据打印在屏幕上。
本文使用的程序托管在 gitos 上:http://git.oschina.net/ivan_allen/unp
如果你已经 clone 过这个代码了,请使用 git pull
更新一下。本节程序所使用的程序路径是 unp/program/nonblockio/biotimecli
.
代码不长,直接贴出来:
#include "common.h" char hostname[64]; int port;void client_routine(); void doClient(int sockfd); int main(int argc, char* argv[]) { Args args = parsecmdline(argc, argv); WARNING("Usage: %s [-h hostname] [-p port]\n", argv[0]); // 随便选了一个默认的 SETSTR(args, hostname, "h", "nisttime.carsoncity.k12.mi.us"); SETINT(args, port, "p", 13); client_routine();}void client_routine() { int ret, sockfd; struct sockaddr_in servaddr; ret = resolve(hostname, port, &servaddr); if (ret < 0) ERR_EXIT("resolve"); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) ERR_EXIT("socket"); // 连接服务器 ret = connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); if (ret < 0) ERR_EXIT("socket"); doClient(sockfd); close(sockfd);}void doClient(int sockfd) { char buf[4096]; int nr; while(1) { nr = iread(sockfd, buf, 4096); if (nr < 0) ERR_EXIT("iread"); else if (nr == 0) { break; } else { writen(STDOUT_FILENO, buf, nr); } }}
3. 实验
3.1 实验一:正常情况
图1 可以正常获取到时间
可以看到,整个程序的运行时间约为 926 ms,毕竟这个服务器(nisttime.carsoncity.k12.mi.us)都在美国 Georgia 州的 Macon 市,所以有点慢。
3.2 实验二:连接超时
图2 连接超时
这次特意选了一个连接超时的,可以看到整个过程持续了约 127 s 左右。
注:早上我连接 wolfnisttime.com 的时候是不超时的,这应该和网络环境有关。如果你实验的时候连接成功也不要奇怪,只能说明你运气太好^_^
4. 总结
编写这个客户端的目的,是为了引出下一个知识点——非阻塞 i/o 上调用 connect. 不同于非阻塞 i/o 读写,在非阻塞 i/o 上调用 connect 要复杂的多。
- 掌握时间获取客户端编写
- 86-时间获取客户端
- 获取客户端时间程序
- 客户端获取服务器时间记时
- 获取服务器时间、客户端时间、北京时间
- 时间获取客户端程序遇到的问题
- 在客户端获取服务器端的时间
- Silverlight+DomainService在客户端获取时间问题
- 获取时间程序(客户端和服务器)
- 客户端TCP时间获取以及实现服务端获取客户端IP地址
- C#获得客户端的IP,主机名 获取当前时间
- 一个简单的TCP 客户端时间获取程序 ipv4/ipv6
- unix网络编程卷1 时间获取客户端程序
- 获取客户端电脑日期时间js代码(jquery)
- L脚本语言开发的时间获取服务器和客户端
- 一个简单的时间获取客户端——服务器程序
- 如何从ATS获取客户端平均响应时间(单位,毫秒)?
- 一个简单的时间获取客户端/服务器程序
- 客户端获取
- Codeforces 723F st-Spanning Tree【贪心Kruskal】
- Dagger2 备忘录
- mybatis开启spring事务
- FLEX中如何获取当前页面的URL的问题
- improve your python code(13)
- 86-时间获取客户端
- 《Linux学习笔记——整理自马哥Linux运维》_待完成
- 使用JAVA控制AD域进行基本的操作详解
- Domino与AD账户同步(二)
- c++上机作业6
- android高版本5.0以上防卸载
- JDBC的批量处理
- 2行代码实现python多线程
- 多线程(3)- 线程通信