获取时间的客户端代码:

  1. //客户端程序
  2. #include "unp.h"
  3.  
  4. int main(int argc, char **argv)
  5. {
  6. int sockfd, n;
  7. char recvline[MAXLINE + ];
  8. struct sockaddr_in servaddr;
  9. //在ipv6可以运行:
  10. //struct sockaddr_in6 servaddr;
  11.  
  12. if (argc != )
  13. err_quit("usage: a.out <IPaddress>");
  14.  
  15. //创建TCP套接字,AF_INET表示网际,SOCK_STREAM表示字节流
  16. if ( (sockfd = socket(AF_INET, SOCK_STREAM, )) < )
  17. err_sys("socket error");
  18. //ipv6 if ( (sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0)
  19.  
  20. //结构体清零
  21. bzero(&servaddr, sizeof(servaddr));
  22. //设置协议族
  23. servaddr.sin_family = AF_INET;
  24. //ipv6 servaddr.sin6_family = AF_INET6;
  25. //设置端口号
  26. servaddr.sin_port = htons(); /* daytime server */
  27. //ipv6 servaddr.sin6_port = htons(8888);
  28. //把输入的点分十进制转换为合适的格式
  29. if (inet_pton(AF_INET, argv[], &servaddr.sin_addr) <= )
  30. //ipv6 if (inet_pton(AF_INET6, argv[1], &servaddr.sin_addr) <= 0)
  31. err_quit("inet_pton error for %s", argv[]);
  32.  
  33. //与指定的服务器建立一个TCP连接
  34. //为了简化,把struct sockaddr宏定义为SA
  35. if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < )
  36. err_sys("connect error");
  37.  
  38. //读服务器的应答,并用标准的I/O函数fputs输出结果.
  39. while ( (n = read(sockfd, recvline, MAXLINE)) > ) {
  40. recvline[n] = ; /* null terminate */
  41. if (fputs(recvline, stdout) == EOF)
  42. err_sys("fputs error");
  43. }
  44. if (n < )
  45. err_sys("read error");
  46.  
  47. //终止程序
  48. exit();
  49. }

获取时间的服务器代码:

  1. #include "unp.h"
  2. #include <time.h>
  3.  
  4. int main()
  5. {
  6. int listenfd,connfd;
  7. struct sockaddr_in servaddr;
  8. char buff[MAXLINE];
  9. time_t ticks;
  10.  
  11. listenfd = Socket(AF_INET,SOCK_STREAM,);
  12.  
  13. bzero(&servaddr,sizeof(servaddr));
  14. servaddr.sin_family = AF_INET;
  15. //指定IP地址为INADDR_ANY的原因是如果服务器主机有多个网络接口,
  16. //服务器进程就可以在任意网络接口上接受客户连接.
  17. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  18. //设置端口号
  19. servaddr.sin_port = htons();
  20.  
  21. Bind(listenfd,(SA *)&servaddr,sizeof(servaddr));
  22.  
  23. //把该套接字转换成一个监听套接字,这样来自客户的外来连接就可以在该
  24. //套接字上由内核接收.LISTENQ在unp.h头文件中定义,用来指定系统内核允许在这个监听
  25. //描述符上排队的最大客户连接数.
  26. Listen(listenfd,LISTENQ);
  27.  
  28. for(;;)
  29. {
  30. //阻塞睡眠模式,三次握手,握手完毕后,accept返回
  31. //返回值是一个已连接描述符,该描述符用于与连接的那个客户通信.
  32. connfd = Accept(listenfd,(SA *)NULL,NULL);
  33.  
  34. //获得当前时间
  35. ticks = time(NULL);
  36.  
  37. //ctime可以把该整数值转换为时间的模式
  38. //snprintf第二个参数指定缓冲区的大小,可以确保该缓冲区不溢出
  39. //为了避免黑客的溢出攻击,最好把使用的函数比如(gets,strcat,strcpy)改为
  40. //fgets,strncat,strncpy
  41. snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
  42. Write(connfd,buff,strlen(buff));
  43.  
  44. //终止连接
  45. close(connfd);
  46. }
  47. return ;
  48. }

17.UNP第一章 简介的更多相关文章

  1. 读书笔记 - javascript 高级程序设计 - 第一章 简介

      第一章 简介   诞生时间 1995 最初用途 客服端验证 第一版标准 注意是标准 1997年 Ecma-262  一个完整的js实现由三部分组成 ECMAScript DOM 文档对象模型 BO ...

  2. UNP学习笔记(第一章 简介)

    环境搭建 1.下载解压unpv13e.tar.gz 2.进入目录执行 ./configurecd lib //进入lib目录make //执行make命令 3.将生成的libunp.a静态库复制到/u ...

  3. Javascript模式(第一章简介)------读书笔记

    一:模式 模式是一个通用问题的解决方案,可以提供一个更好的实践经验.有用的抽象化表示和解决一类问题的模板. 本书主要讨论如下三种类型的模式 1 设计模式:可复用面向对象软件的基础,包括singleto ...

  4. KnockoutJS 3.X API 第一章 简介

    本文纯正翻译自官网API文档.其中包含一下个人理解. 官网API地址:http://knockoutjs.com/documentation/introduction.html 简介 Knockout ...

  5. python3 第一章 - 简介

    1.什么是python 引用官方的话:Python是一种易于学习,强大的编程语言.它具有高效的高级数据结构,并通过简单而有效的方法来进行面向对象编程.Python的优雅语法和动态类型,以及其解释性质, ...

  6. UNIX网络编程卷1 第一章 简介 读书笔记。

    基本没讲什么,一点点计算机网络发展史,一点点socket()简单介绍,最重要的是1.3节协议无关性. 协议无关性: 贯穿整本书的一个重要特性,他主要强调的是 socket是网络协议无关的编程接口. s ...

  7. 《JAVA NIO》第一章 简介

    1.2 CPU已不再是束缚 相反,是JVM 自身在I/O 方面效率欠佳.操作系统与Java 基于流的I/O模型有些不匹配. 操作系统要移动的是大块数据(缓冲区),这往往是在硬件直接存储器存取(DMA) ...

  8. Spring in Action --- 第一章 简介

    简化java开发 基于POJO的轻量级和最小入侵性编程 通过依赖注入和面向接口实现松耦合 基于切面和管理进行声明式编程 通过切面和模板减少样板式代码 bean的生命周期 Spring对bean进行实例 ...

  9. 《深入Linux内核架构》笔记 --- 第一章 简介和概述

    Linux将虚拟地址空间划分为两个部分,分别称为内核空间和用户空间 各个系统进程的用户空间是完全彼此分离的,而虚拟地址空间顶部的内核空间总是同样的,无论当前执行的是哪个进程. 尽管Intel处理器区分 ...

随机推荐

  1. css3中的animation属性

    作用:通过给元素添加animation属性,可以赋予该元素动画效果. <!DOCTYPE html><html>    <head>        <styl ...

  2. cropper+pillow处理上传图片剪裁(二)

    上次说到处理上传头像的方法是临时保存在本地,其实这样做并不妥,而且修改后的头像重新上传到model中也很麻烦,差了很多资料,解决了这个问题 大致思路:用户上传原图和修改数据—PIL修改后将图片保存为内 ...

  3. 关于iscroll.js插件的使用

    iscroll 作用: 可以让区域滚动效果好看一些 使用: 1. html结构 外面必须包一层盒子,切内部的元素要尽量简单,不然会影响滚动效果 <div id="wrapper&quo ...

  4. H5 微信公众号 监听返回事件

    /*-----监听返回事件-----*/ function pushHistory(returnUrl,currentUrl,currentTitle) { window.addEventListen ...

  5. 详解sqlserver查询表索引

    SELECT   索引名称=a.name ,表名=c.name ,索引字段名=d.name ,索引字段位置=d.colid ? 1 2 3 4 5 6 7 8 FROM  sysindexes  a ...

  6. Openwrt PPTP Server笔记

    1.安装PPTP opkg updateopkg install kmod-mppeopkg install pptpd 2./etc/pptpd.conf option /etc/ppp/optio ...

  7. QS之vsim

    vsim - The vsim command invokes the VSIM simulator -L <library_name> … (optional) Specifies th ...

  8. PythonOpenCV--Rtrees随机森林

    360确实很个性,哈哈,你个貔貅,只吃不吐! Rtrees介绍!参考链接:http://docs.opencv.org/modules/ml/doc/random_trees.html 原文链接:Py ...

  9. adb使用实践

    目录 1. adb 端口占用 2. 查看包名和MainAcitivity =============================================================== ...

  10. (转)基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览

    http://www.cnblogs.com/wuhuacong/p/3871991.html 基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览 在博客园很多文章 ...