UNP学习第一步:unp.h的安装及第一个程序的运行
- unp.h的安装
-
- 源代码编译
- 静态库安装
- 运行第一个程序
-
- 启动daytime服务
unp.h的安装
源代码编译
- 在书籍网站(http://www.unpbook.com/src.html)上下载本书源码
- 解压到本地文件夹
tar -xzf unpv13e.tar.gz
- 进入解压后的文件夹,阅读
README
说明文件。根据说明文件的要求,按如下步骤完成配置。 - 运行
./configure
,用于分析本地环境,为代码进行正确配置 - 进入
lib
文件夹,运行make
,用于编译unp.h
对应的静态库 - 进入
libfree
文件夹,运行make
,继续编译基本运行库。
注:此时有可能会发生如下错误:inet_ntop.c: In function ‘inet_ntop’: inet_ntop.c:60:9: error: argument ‘size’ doesn’t match prototype size_t size; In file included from inet_ntop.c:27:0: /usr/include/arpa/inet.h:64:20: error: prototype declaration extern const char *inet_ntop (int __af, const void *__restrict __cp,<builtin>: recipe for target 'inet_ntop.o' failed make: *** [inet_ntop.o] Error 1
这是由于
unp.h
中的一个变量描述和inet_ntop.c
中的类型不一致引起的,因此只需要编辑inet_ntop.c
文件中的第60行,将类型size_t
改为socklen_t
即可。
解决错误后继续完成make
,可能会存在一些无关痛痒的warning,但能看到代码已经被编译到../libunp.a
中了。 - 在
README
中的第三和第四步分别适用于其他UNIX系统,Linux系统不需要执行这两步。 - 最后对编译出来的静态库进行测试:进入
intro
文件夹,运行make daytimetcpcli
,能得到可运行文件daytimetcpcli
。至此unp的运行库已经编译成功。
静态库安装
- 在
.\lib\unp.h
头文件中,将#include "../config.h"
改为#include "config.h"
,因为我们即将把这两个文件移动到同一路径下。 - 将
.\lib\unp.h
以及./config.h
两个文件复制到./usr/include
文件夹下。sudo cp config.h /usr/include sudo cp lib/unp.h /usr/include
- 将编译好的运行库(
libunp.a
)分别复制到usr/lib
和usr/lib32
文件夹下。sudo cp libunp.a /usr/lib sudo cp libunp.a /usr/lib32
- 测试安装是否正确:使用GCC编译本书第一个示例程序
intro/daytimetcpcli.c
gcc intro/daytimetcpcli.c -o daytimetcpcli -lunp
其中
-lunp
表示在链接时在默认路径中使用libunp.a
库。
此时会在当前文件夹下生成可执行文件daytimetcpcli
,表示已经正确配置本书需要的运行环境。 - 最后,运行第一个程序
./daytimetcpcli 127.0.0.1
不出意外会出现错误提示
connect error: Connection refused
,这是因为本地主机并未启用daytime服务。
运行第一个程序
启动daytime服务
- 输入
xinetd
,如果没有输出,则代表服务已经安装了,只是未启用,反之需要安装服务。sudo apt install xinetd
等待安装完成即可,但默认daytime服务是不会启用的,所以需要进一步配置。
- 使用管理员权限编辑
/etc/xinetd.d/daytime
文件,将第一个disable
项改为no
(注:第一个service代表tcp版本,后一个为udp版本,在这里我们只需要启用tcp版本的daytime服务即可),保存文件。 - 重新启动
xinetd
服务sudo /etc/init.d/xinetd restart
一般来说可以观察到
xinetd
服务的停止与启动。 - 回到最初的文件夹,运行上节编译好的
daytimetcpcli
程序,此时可以得到正确的时间。第一个程序运行成功。./daytimetcpcli 127.0.0.1