# unpv13e **Repository Path**: dingisoul/unpv13e ## Basic Information - **Project Name**: unpv13e - **Description**: DLUT-SE :高级C的文件仓库 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-26 - **Last Updated**: 2021-12-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 快速指南 ## 构建 在你下载的 unpv13e/ 文件夹下执行以下操作 ```bash ./configure # 检查依赖,可根据报错安装相应的包 cd lib # 构建所有实验都需要的基本库 make # 在 BSD/OS 中使用 "gmake" cd ../libfree #继续构建所需的库 make #注意!!下面两行在linux系统上无需执行 cd ../libroute # 系统支持 4.4BSD 风格的路由套接字 make #下面测试构建是否成功 cd ../intro # 构建并测试一个基本的客户端程序 make daytimetcpcli ./daytimetcpcli 127.0.0.1 ``` > 如果最后一步测试出现问题请看[issue](https://gitee.com/dingisoul/unpv13e/issues/I4JWPB) 如果上述命令无误执行,那么你就可以开始编译自己的程序了 注意,所有源代码都假设制表符是4列,而不是8列。 --- ## 更多的细节 如果你对更多的细节感兴趣,可以往下看,==不看当然也没有问题==。 1. 如果你想修改头文件 "unp.h" 那么你只需要修改一次,因为它是以[硬链接](#4)的形式存在于每个文件夹中 (git不支持) 2. 在 "lib/" 文件夹中的 "make" 命令会编译库文件 "libunp.a" ,几乎所有程序都需要他。编译器可能会出现警告(详情见[注释](#3))。你会在这一步检查所有系统依赖,如果出现问题请解决后从头再次执行一遍 3. 在 "libfree/" 下执行 "make"。这一步把一些依赖添加了一些不需要"unp.h" 的函数到 "libunp.a”。方便大家仅使用这些函数而不拘泥于书中的所构建的例子。 4. 在你执行了前两步后,你可以进入 "unpv13e" 的任何文件夹下编译任何程序并使用。那些在书中程序片段的开头和末尾提供了他所属的文件夹和文件名 ==注意==: 1. 不是所有的程序都支持任何系统 - 例如:当你的系统支持 `IP_RECVSTADDR` 套接字选项时 `src/advio/recvfromflags.c` 才能被编译 2. 不是所有的文件在书中都能找到,注意文件名中带有 "test" 的,这可能只是一个测试程序,不保证能运行 ## 注释 - 很多系统的socket设计不尽相同,这可能会在编译期间产生很多警告。 - 例如,Solaris 2.5 省略了`connect()`函数的第二个参数中的"const"。 - 很多系统使用"int"作为套接字地址的长度,但是 Posix.1g 坚持使用 "size_t"。 - 许多系统仍然有`[sg]etsockopt()`的指针参数设为为"char *"而不是"void *"。 - SunOS 4.1.x: 如果你使用Sun公司的acc编译器,你需要在第一步执行以下命令。如果不这样做,就会导致找不到许多系统头文件(),从而导致之后的编译错误。 ```bash CC=acc CFLAGS=-w CPPFLAGS=-w ./configure ``` - 如果你的系统支持IPV6且你想有使用hostnames运行例子的话,你需要安装最新的[BIND](ftp://ftp.vix.com/pub/bind/release)例子。从中获取一个解析器库,然后将其添加到LDLIBS和LDLIBS_THREADS中。 - IPv6的标准仍在制定阶段。IPv6套接字的API规范和供应商提供的版本之间可能存在差异。这可能需要手工调整,但慢慢就会变得更好。 - 如果你的系统仍在使用Posix pthreads标准的旧草案,但是configure检测到对pthreads的支持,你需要手动禁用它。例如,Digital Unix V3.2C就有这个问题,因为它支持草案4,而不是最终草案。 - 要修复这个问题,请在 "Make.defines"的 LIB_OBJS 中删除wrappthread.o,并且不要编译和运行任何支持线程的程序。 # Reference & 解释 硬链接(hard link): 指向同一个文件的不同(位置+名称) 以下是作者在 Posix.1g 或 X/Open XNS Issue 5级别的各种头文件中看到的常见差异。 - getsockopt()和setsockopt(): 第5版的参数不是正确的类型。 - t_bind(): 第二个参数缺少"const"。 - t_connect():第二个参数缺少"const"。 - t_open():第一个参数缺少“const”。 - t_optmsmg():第二个参数缺少"const"。 - 如果你的 头文件将`t_opthdr{}`的成员定义为long类型,而不是`t_uscalar_t`,在使用printf格式化输出时编译器中可能生成警告,因为在打印long类型时没有相应的格式说明符。