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处理器区分 ...
随机推荐
- CSS vs. JS Animation: 哪个更快
CSS vs. JS Animation: 哪个更快? CSS vs. JS Animation: 哪个更快? 基于JavaScript的动画竟然已经默默地比CSS的transition动画快了?而且 ...
- (转)使用Vue-Router 2实现路由功能
注意:vue-router 2只适用于Vue2.x版本,下面我们是基于vue2.0讲的如何使用vue-router 2实现路由功能.推荐使用npm安装. npm install vue-router ...
- Tomcat应用通过Nat123部署到外网(Tomcat+Nat123)
这里吐槽下,我先想到的方式是用花生壳域名解析,但是花生壳坑太多不易新手操作,用户体验做的不好.然后度娘后才知道有Nat123这个比花生壳简易操作的软件. 1.到nat123官网下载客户端 http: ...
- String[]转化暴露“思维误区”
那天写code,用到这个,强转,将页面传来的值转换为数组,结果是,当页面传来的只有一个值时,它是无法转换为数组的,只能获得1个string,只有length>1时才会转化为数组的形式,报的错误是 ...
- 面试官:精通 Mybatis?请回答下这几个问题
点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! Mybatis是现在非常主流的持久层框架,虽然平时用的多,但是其中几个细节的问题,能说出个所以然来不? 一.最常见,参数中 #{} 和 $ ...
- MySQL_pymysql模块
安装:pip install pymysql 基本操作 import pymysql conn=pymysql.connect(host=',database='lary',charset='utf8 ...
- 路飞学城Python-Day78
17-静态文件配置1 静态的文件的配置不能直接将CSS.JS文件直接放在templates的文件夹中 要将所有的静态文件放在static的文件夹中,然后配置上静态文件static的路径 要想访问Dja ...
- 路飞学城Python-Day59(第五模块复习题)
HTML div标签是块级标签,单独一行,可以作为其他标签的容器,没有特定含义 span是内联标签,可以作为文本内容的容器,没有特定含义 1. 查询一下对div和span标签的理解 不同的标签有自己含 ...
- Python数据分析5-----数据规约
1.数据规约概念和目的 数据规约是产生更小且保留数据完整性的新数据集. 意义:降低无效错误数据的影响.更有效率.降低存储成本. 2.属性规约 (1)属性合并(降维):比如PCA (2)删除不相关属性 ...
- redhat的systemd版本list
acess https://access.redhat.com/errata/#/ https://github.com/lnykryn/systemd-rhel redhat 知识库 redhat ...