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/libusr/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