mirror of
https://github.com/riba2534/TCP-IP-NetworkNote.git
synced 2026-02-02 17:48:55 +08:00
完成第一章 理解网络编程和套接字
This commit is contained in:
83
README.md
83
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(署名 - 非商业性使用) 协议,转载请注明出处。
|
||||
|
||||
[](http://creativecommons.org/licenses/by-nc-sa/4.0/)
|
||||
|
||||
|
||||
22
ch01/fd_seri.c
Normal file
22
ch01/fd_seri.c
Normal file
@@ -0,0 +1,22 @@
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user