# 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类型时没有相应的格式说明符。