17.UNP第一章 简介
获取时间的客户端代码:
//客户端程序
#include "unp.h" int main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + ];
struct sockaddr_in servaddr;
//在ipv6可以运行:
//struct sockaddr_in6 servaddr; if (argc != )
err_quit("usage: a.out <IPaddress>"); //创建TCP套接字,AF_INET表示网际,SOCK_STREAM表示字节流
if ( (sockfd = socket(AF_INET, SOCK_STREAM, )) < )
err_sys("socket error");
//ipv6 if ( (sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0) //结构体清零
bzero(&servaddr, sizeof(servaddr));
//设置协议族
servaddr.sin_family = AF_INET;
//ipv6 servaddr.sin6_family = AF_INET6;
//设置端口号
servaddr.sin_port = htons(); /* daytime server */
//ipv6 servaddr.sin6_port = htons(8888);
//把输入的点分十进制转换为合适的格式
if (inet_pton(AF_INET, argv[], &servaddr.sin_addr) <= )
//ipv6 if (inet_pton(AF_INET6, argv[1], &servaddr.sin_addr) <= 0)
err_quit("inet_pton error for %s", argv[]); //与指定的服务器建立一个TCP连接
//为了简化,把struct sockaddr宏定义为SA
if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < )
err_sys("connect error"); //读服务器的应答,并用标准的I/O函数fputs输出结果.
while ( (n = read(sockfd, recvline, MAXLINE)) > ) {
recvline[n] = ; /* null terminate */
if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
if (n < )
err_sys("read error"); //终止程序
exit();
}
获取时间的服务器代码:
#include "unp.h"
#include <time.h> int main()
{
int listenfd,connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks; listenfd = Socket(AF_INET,SOCK_STREAM,); bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
//指定IP地址为INADDR_ANY的原因是如果服务器主机有多个网络接口,
//服务器进程就可以在任意网络接口上接受客户连接.
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//设置端口号
servaddr.sin_port = htons(); Bind(listenfd,(SA *)&servaddr,sizeof(servaddr)); //把该套接字转换成一个监听套接字,这样来自客户的外来连接就可以在该
//套接字上由内核接收.LISTENQ在unp.h头文件中定义,用来指定系统内核允许在这个监听
//描述符上排队的最大客户连接数.
Listen(listenfd,LISTENQ); for(;;)
{
//阻塞睡眠模式,三次握手,握手完毕后,accept返回
//返回值是一个已连接描述符,该描述符用于与连接的那个客户通信.
connfd = Accept(listenfd,(SA *)NULL,NULL); //获得当前时间
ticks = time(NULL); //ctime可以把该整数值转换为时间的模式
//snprintf第二个参数指定缓冲区的大小,可以确保该缓冲区不溢出
//为了避免黑客的溢出攻击,最好把使用的函数比如(gets,strcat,strcpy)改为
//fgets,strncat,strncpy
snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
Write(connfd,buff,strlen(buff)); //终止连接
close(connfd);
}
return ;
}
17.UNP第一章 简介的更多相关文章
- 读书笔记 - javascript 高级程序设计 - 第一章 简介
第一章 简介 诞生时间 1995 最初用途 客服端验证 第一版标准 注意是标准 1997年 Ecma-262 一个完整的js实现由三部分组成 ECMAScript DOM 文档对象模型 BO ...
- UNP学习笔记(第一章 简介)
环境搭建 1.下载解压unpv13e.tar.gz 2.进入目录执行 ./configurecd lib //进入lib目录make //执行make命令 3.将生成的libunp.a静态库复制到/u ...
- Javascript模式(第一章简介)------读书笔记
一:模式 模式是一个通用问题的解决方案,可以提供一个更好的实践经验.有用的抽象化表示和解决一类问题的模板. 本书主要讨论如下三种类型的模式 1 设计模式:可复用面向对象软件的基础,包括singleto ...
- KnockoutJS 3.X API 第一章 简介
本文纯正翻译自官网API文档.其中包含一下个人理解. 官网API地址:http://knockoutjs.com/documentation/introduction.html 简介 Knockout ...
- python3 第一章 - 简介
1.什么是python 引用官方的话:Python是一种易于学习,强大的编程语言.它具有高效的高级数据结构,并通过简单而有效的方法来进行面向对象编程.Python的优雅语法和动态类型,以及其解释性质, ...
- UNIX网络编程卷1 第一章 简介 读书笔记。
基本没讲什么,一点点计算机网络发展史,一点点socket()简单介绍,最重要的是1.3节协议无关性. 协议无关性: 贯穿整本书的一个重要特性,他主要强调的是 socket是网络协议无关的编程接口. s ...
- 《JAVA NIO》第一章 简介
1.2 CPU已不再是束缚 相反,是JVM 自身在I/O 方面效率欠佳.操作系统与Java 基于流的I/O模型有些不匹配. 操作系统要移动的是大块数据(缓冲区),这往往是在硬件直接存储器存取(DMA) ...
- Spring in Action --- 第一章 简介
简化java开发 基于POJO的轻量级和最小入侵性编程 通过依赖注入和面向接口实现松耦合 基于切面和管理进行声明式编程 通过切面和模板减少样板式代码 bean的生命周期 Spring对bean进行实例 ...
- 《深入Linux内核架构》笔记 --- 第一章 简介和概述
Linux将虚拟地址空间划分为两个部分,分别称为内核空间和用户空间 各个系统进程的用户空间是完全彼此分离的,而虚拟地址空间顶部的内核空间总是同样的,无论当前执行的是哪个进程. 尽管Intel处理器区分 ...
随机推荐
- Java基础8一面向对象
一.JavaBean标准的定义规范 1.类中所有的属性必须是私有的,也就是说属性必须用private修饰. 2.提供一个公共无参数的构造方法. 3.为所有私有的属性提供公共的set和get方法. se ...
- AI:从游戏引擎--到AI
原文链接:http://blog.csdn.net/left_la/article/details/6358911#t9 这是我在Gameres上看到的一篇文章,文章很长,全文分为11个部分,看后感觉 ...
- (转)Bootstrap 之 Metronic 模板的学习之路 - (6)自定义和扩展
https://segmentfault.com/a/1190000006815041 前面我们将 Metronic 的结构和源码大致浏览了一遍,Metronic 整个文件包有三百多兆,在实际项目中, ...
- 应用二:Vue之ElementUI Form表单校验
(注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的) 表单校验是前端开发过程中最常用到的功能之一,根据个人的工作经验总结在此对表单校验功能的基 ...
- 优动漫PAINT如何打开图形文件
优动漫PAINT也就是我们常说的clip studio paint(CSP)的中文版本,在优动漫PAINT软件中打开文件的方式有很多,您可以直接拖拽至优动漫PAINT界面或者文档窗口,也可以执行文件菜 ...
- 如何在vue里面正确的引用 jquery 和 第三方插件
vue-cli webpack全局引入jquery(jq通过npm安装的并非本地文件) 1.首先在package.json里加入, dependencies:{ "jquery" ...
- new String(getBytes(ISO-8859-1),UTF-8)中文编码避免乱码
byte[] b_gbk = "深".getBytes("GBK"); byte[] b_utf8 = "深".getBytes(" ...
- Windows GUI程序自动化之pywinauto
一. pywinauto知识点总结 官方英文版文档网址:https://pywinauto.readthedocs.io/en/latest/index.html 1.1 pywinauto的安装与配 ...
- 用CSS来控制字符长度和显示长度
在网页排版设计中,会遇到文本超过固定长度导致整体的网页变形的情况.程序员往往需要截取固定的长度来实现某些固定长度的控制.介绍一种直接采 用CSS的代码控制来实现文本截取的方法,与程序员的直接字符截取的 ...
- Linux 文件压缩
压缩工具 compress/uncompress:对应 .Z 结尾的压缩格式文件 压缩格式:gz.bz2.xz.zip.Z gzip 压缩文件并删除源文件(生成.gz的文件) gunzip 解 ...