UNP学习第一步:unp.h的安装及第一个程序的运行
1.源代码编译
在书籍网站点击此处即可上下载本书源码
解压到本地文件夹
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
的运行库已经编译成功。
2.静态库安装
在.\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服务。
3.运行第一个程序
启动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