diff --git a/README.md b/README.md index a6acc32..9335f4d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 《TCP/IP网络编程》学习笔记 -此仓库是我的《TCP/IP网络编程》学习笔记及具体代码实现,代码部分请参考本仓库对应章节文件夹下的代码。 +:flags:此仓库是我的《TCP/IP网络编程》学习笔记及具体代码实现,代码部分请参考本仓库对应章节文件夹下的代码。 我的环境是:Ubuntu18.04 LTS @@ -10,6 +10,8 @@ ## 第一章:理解网络编程和套接字 +本章代码,在[TCP-IP-NetworkNote](https://github.com/riba2534/TCP-IP-NetworkNote)中可以找到。 + ### 1.1 理解网络编程和套接字 #### 1.1.1构建打电话套接字 @@ -235,3 +237,82 @@ file data: Let's go! 关于文件描述符的 I/O 操作到此结束,要明白,这些内容同样适合于套接字。 +#### 1.2.6 文件描述符与套接字 + +下面将同时创建文件和套接字,并用整数型态比较返回的文件描述符的值. + +代码见:[fd_seri.c](ch01/fd_seri.c) + +**编译运行**: + +```shell +gcc fd_seri.c -o fds +./fds +``` + +**输出结果**: + +``` +file descriptor 1: 3 +file descriptor 2: 15 +file descriptor 3: 16 +``` + +### 1.3 基于 Windows 平台的实现 + +暂略 + +### 1.4 基于 Windows 的套接字相关函数及示例 + +暂略 + +### 1.5 习题 + +> :heavy_exclamation_mark:以下部分的答案,仅代表我个人观点,可能不是正确答案 + +1. 套接字在网络编程中的作用是什么?为何称它为套接字? + + > 答:操作系统会提供「套接字」(socket)的部件,套接字是网络数据传输用的软件设备。因此,「网络编程」也叫「套接字编程」。「套接字」就是用来连接网络的工具。 + +2. 在服务器端创建套接字以后,会依次调用 listen 函数和 accept 函数。请比较二者作用。 + + > 答:调用 listen 函数将套接字转换成可受连接状态(监听),调用 accept 函数受理连接请求。如果在没有连接请求的情况下调用该函数,则不会返回,直到有连接请求为止。 + +3. Linux 中,对套接字数据进行 I/O 时可以直接使用文件 I/O 相关函数;而在 Windows 中则不可以。原因为何? + + > 答:暂略。 + +4. 创建套接字后一般会给他分配地址,为什么?为了完成地址分配需要调用哪个函数? + + > 答:套接字被创建之后,只有为其分配了IP地址和端口号后,客户端才能够通过IP地址及端口号与服务器端建立连接,需要调用 bind 函数来完成地址分配。 + +5. Linux 中的文件描述符与 Windows 的句柄实际上非常类似。请以套接字为对象说明它们的含义。 + + > 答:暂略。 + +6. 底层 I/O 函数与 ANSI 标准定义的文件 I/O 函数有何区别? + + > 答:文件 I/O 又称为低级磁盘 I/O,遵循 POSIX 相关标准。任何兼容 POSIX 标准的操作系统上都支持文件I/O。标准 I/O 被称为高级磁盘 I/O,遵循 ANSI C 相关标准。只要开发环境中有标准 I/O 库,标准 I/O 就可以使用。(Linux 中使用的是 GLIBC,它是标准C库的超集。不仅包含 ANSI C 中定义的函数,还包括 POSIX 标准中定义的函数。因此,Linux 下既可以使用标准 I/O,也可以使用文件 I/O)。 + +7. 参考本书给出的示例`low_open.c`和`low_read.c`,分别利用底层文件 I/O 和 ANSI 标准 I/O 编写文件复制程序。可任意指定复制程序的使用方法。 + + > 答:暂略。 + +## 第二章 套接字类型与协议设置 + +### 2.1 套接字协议及数据传输特性 + + + + + + + + + +## License + +本仓库遵循 CC BY-NC-SA 4.0(署名 - 非商业性使用) 协议,转载请注明出处。 + +[![CC BY-NC-SA 4.0](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-nc-sa/4.0/) + diff --git a/ch01/fd_seri.c b/ch01/fd_seri.c new file mode 100644 index 0000000..8524a5d --- /dev/null +++ b/ch01/fd_seri.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +int main() +{ + int fd1, fd2, fd3; + //创建一个文件和两个套接字 + fd1 = socket(PF_INET, SOCK_STREAM, 0); + fd2 = open("test.dat", O_CREAT | O_WRONLY | O_TRUNC); + fd3 = socket(PF_INET, SOCK_DGRAM, 0); + //输出之前创建的文件描述符的整数值 + printf("file descriptor 1: %d\n", fd1); + printf("file descriptor 2: %d\n", fd2); + printf("file descriptor 3: %d\n", fd3); + + close(fd1); + close(fd2); + close(fd3); + return 0; +} \ No newline at end of file