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

环境搭建

1.下载解压unpv13e.tar.gz

2.进入目录执行

./configurecd lib   //进入lib目录make     //执行make命令

3.将生成的libunp.a静态库复制到/usr/lib/和/usr/lib64/中

cd ..   //返回unpv13e目录sudo cp libunp.a /usr/lib
sudo cp libunp.a /usr/lib64  

4.修改unp.h并将其和config.h拷贝到/usr/include中,为了以后include方便

vi lib/unp.h
//将unp.h中#include "../config.h"修改为#include "config.h"  
sudo cp lib/unp.h /usr/include
sudo cp config.h /usr/include  

5.编译源代码

cd ./intro
gcc -o daytimetcpcli daytimetcpcli.c -lunp

跟普通的编译不一样的是要在最后加上刚才那个链接库,-l参数加上刚才那个libunp.a去掉lib和后面的.a。最后得到参数-lunp。

下面是socket网络编程的实例,代码将在后面章节进行详细说明

一个简单的时间获取客户程序

 1 #include    "unp.h"
 2
 3 int
 4 main(int argc, char **argv)
 5 {
 6     int                    sockfd, n;
 7     char                recvline[MAXLINE + 1];
 8     struct sockaddr_in    servaddr;
 9
10     if (argc != 2)
11         err_quit("usage: a.out <IPaddress>");
12
13     if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
14         err_sys("socket error");
15
16     bzero(&servaddr, sizeof(servaddr));
17     servaddr.sin_family = AF_INET;
18     servaddr.sin_port   = htons(13);    /* daytime server */
19     if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
20         err_quit("inet_pton error for %s", argv[1]);
21
22     if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
23         err_sys("connect error");
24
25     while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
26         recvline[n] = 0;    /* null terminate */
27         if (fputs(recvline, stdout) == EOF)
28             err_sys("fputs error");
29     }
30     if (n < 0)
31         err_sys("read error");
32
33     exit(0);
34 }

上面是TCP当前时间查询客户程序的一个实现。该客户与服务器建立一个TCP连接后,服务器以直观可读格式简单地送回当前时间和日期。

协议无关性

上面程序与IPv4协议相关。修改该程序,让它能够在IPv6运行

 1 #include    "unp.h"
 2
 3 int
 4 main(int argc, char **argv)
 5 {
 6     int                    sockfd, n;
 7     struct sockaddr_in6    servaddr;
 8     char                recvline[MAXLINE + 1];
 9
10     if (argc != 2)
11         err_quit("usage: a.out <IPaddress>");
12
13     if ( (sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0)
14         err_sys("socket error");
15
16     bzero(&servaddr, sizeof(servaddr));
17     servaddr.sin6_family = AF_INET6;
18     servaddr.sin6_port   = htons(13);    /* daytime server */
19     if (inet_pton(AF_INET6, argv[1], &servaddr.sin6_addr) <= 0)
20         err_quit("inet_pton error for %s", argv[1]);
21
22     if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
23         err_sys("connect error");
24
25     while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
26         recvline[n] = 0;    /* null terminate */
27         if (fputs(recvline, stdout) == EOF)
28             err_sys("fputs error");
29     }
30     if (n < 0)
31         err_sys("read error");
32
33     exit(0);
34 }

包裹函数

本书例子通过包裹函数来进行错误处理:约定包裹函数名是实际函数名的首字母大写形式,例如Socket函数是socket的包裹函数,下面代码将演示这个包裹函数

1 int
2 Socket(int family, int type, int protocol)
3 {
4     int n;
5     if( (n = socket(family, type, protocol)) < 0)
6         err_sys("socket error");
7     return (n);
8 }

一个简单的时间获取服务器程序

 1 #include    "unp.h"
 2 #include    <time.h>
 3
 4 int
 5 main(int argc, char **argv)
 6 {
 7     int                    listenfd, connfd;
 8     struct sockaddr_in    servaddr;
 9     char                buff[MAXLINE];
10     time_t                ticks;
11
12     listenfd = Socket(AF_INET, SOCK_STREAM, 0);
13
14     bzero(&servaddr, sizeof(servaddr));
15     servaddr.sin_family      = AF_INET;
16     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
17     servaddr.sin_port        = htons(13);    /* daytime server */
18
19     Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
20
21     Listen(listenfd, LISTENQ);
22
23     for ( ; ; ) {
24         connfd = Accept(listenfd, (SA *) NULL, NULL);
25
26         ticks = time(NULL);
27         snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
28         Write(connfd, buff, strlen(buff));
29
30         Close(connfd);
31     }
32 }

测试程序

使用root用户使服务器程序从后台运行

运行第一个客户端程序

127.0.0.1是环回地址。本例子中客户端程序连接到服务器程序,服务器程序将时间跟日期发送给客户端,然后客户端将它打印到终端中。

时间: 2025-01-15 15:21:57

UNP学习笔记(第一章 简介)的相关文章

《Java并发变成实践》读书笔记---第一章 简介

<Java并发编程实战>深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册.书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险.构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,最后介绍了一些高级主题,如显式锁.原子变量.非阻塞算法以及

JavaScript学习笔记(第一章——第三章)

说明 参考资料:<JavaScript高级程序设计(第3版)> 笔记主要为<JavaScript高级程序设计(第3版)>读书记录,按照此书的章节学习记录.方便以后查询复习(PS:正版书99大洋,没舍得买.在淘宝46买了一本盗版的并带一本 <JavaScript DOM编程艺术(第2版)>).两本书同时阅读,但以<JavaScript高级程序设计(第3版)>为主要学习路线.重要说明性内容将以近似书中原文摘出(以免出现个人解释歧义),外加自己遇到特殊情况说明(不

latex学习笔记 第一章 LATEX须知

本学习笔记全部从http://www.latexstudio.net/archives/6058抽取总结而来. 第一章 LATEX须知 1.1 概述 1.1.1 TEX TEX是高德纳开发的.以排版文字和数学公式为目的的一个计算机软件. 1.1.2 LATEX LATEX为TEX基础上的一套格式,令作者能够使用预定义的专业格式以较高质量排版和印刷他们的作品. 1.2 LATEX命令和代码结构 LATEX的源代码本质上是文本文件.除了文字本身,LATEX源代码之外还包括大量的命令,用在排版公式.划

数据库系统概论学习笔记-第一章绪论

数据库系统概论-第一章绪论 写在前面:寒假来临,除却走亲戚和同学聚餐,王者荣耀等游戏上分花销一点时间之外,自认为要花一点时间学习数据库和Android,以此来为下学期和共建项目打下一丢丢的基础.为了鞭策自己,定了一个小目标( 一个亿),每个两至三天我会发表一篇数据库或Android学习笔记.还是那句话你的才华撑不住你的野心时,那就静下来学习吧 . 数据库系统概述 数据库常用的术语和基本概念 数据库基本概念 数据(Data) 数据是数据库中存储的基本对象,可以对数据做如下定义:描述事物的符号记录称

K&amp;R 学习笔记 第一章

今天开始学习C语言,为了之后的游戏开发学习做好基础,其实在大一的时候学校有C语言的课程,学的马马虎虎,教学也比较浅显,感觉并不能学习到C语言的精髓.在经过多人推荐下,入手了K&R ,看了第一章之后,才发现的确值得这么多人称赞. 其实大多数书的第一章都是差不多的,以Hello World 引出本书学习的知识体系的顺序,有趣的是之后的练习,也是要花一番功夫的. 1.4 提到了幻数,所谓幻数,就是在程序中直接使用的数字.C语言的传统方式是使用#define行来对付幻数.C语言预处理程序是一个强有力的工

【PMP】Head First PMP 学习笔记 第一章引言

第一章 引言 高效的解决项目中同样的问题 最佳的评估你的任务并合理安排,从而保证项目尽可能迅速而高效的完成 计划和跟踪成本的有关技术 如何针对项目中存在的缺陷做出计划并加以防范 项目经理的特征 知识. 关注项目领域的发展动态,可以从每个人的成功和失误中学习经验教训,从而能更好的完成你的工作.知道所有的工具和技术,并且知道何时使用和如何使用. 绩效. 必须付诸行动,要求你认真而有效地工作. 个人技能. 既然你要管理人,就注意哪些方面能够激励他们,哪些方面会对他们造成障碍.作为一个项目经理,你的任务

Android学习笔记—第一章 搭建开发环境

第一章 Android开发环境搭建 开发工具:adt-bundle-windows http://pan.baidu.com/s/1wIgFW 配置环境变量 D:\Program Files (x86)\Android\adt-bundle-windows-x86-20131030\sdk\platform-tools 以上是sdk\platform-tools的路径,根据个人电脑上安装路径不同而定.配置好环境变量后,可输入adb命令进行测试. 常用abd命令 (1)查看当前正在运行的模拟器信息

《算法导论》学习笔记第一章(算法在计算中的作用)

第一章主要讲了一些概念,什么是算法,为什么算法值得研究. 印象比较深的是章节的最后一句,是否具有算法知识与技术的坚实基础是区分真正熟练的程序员与初学者的一个特征.使用现代计算技术,如果你对算法懂得不多,你也可以完成一些任务,但是,如果有一个好的算法背景,那么你可以做的事情就多得多. Having a solid base of algorithmic knowledge and technique is one characteristic that separates the truly sk

离散数学及其应用(Discrete Mathematica With Application 7th)学习笔记 第一章

目前本人只进行到了第五章的章末补充练习,应该是从4月6号开始学习的,又是英文版,而且基本就下班回家抽2个小时左右去学,所以进度较慢. 由于本质是数学,除了一些程序处理和大计算量的问题,基本上一本草稿本和一支笔即可.其实这次已经是三周目了, 第一次是大二,只是粗略目扫一遍,很多都是不理解就跳过,假装自己已经懂了:第二遍是毕业之后第一年,大概稍比第一次多懂了一些之前遗留跳过的概念,推论,和问题,但也只能说是基本上只吃透了差不多60%而已.时隔两年,又重拾基本核心,希望可以再次温故知新吧. 先说下全书

Linux就该这么学,学习笔记第一章(介绍和安装)

目的:1.学好linux,随着大数据,云等应用,开源软件将占领市场,这些应用都是基于linux的. 2.通过RHCE认证考试 原因:1.人的自律很困难,必须付出代价(交钱上课完成作业)等方式强迫自己学习.(自己也喜欢学习linux) 2.本人年龄偏大40岁,但认为学习不可放松,活到老学到老. 正题: 1.我什么要学习linux 基于服务器的应用,性能高,占用资源少(省去图形界面资源开销),开源支持漏洞及病毒少,费用免费或低廉. 2.vmware workstation 虚拟机安装学习. 安装关键