1.文件句柄
2.Socket句柄
1.文件句柄
文件句柄理解成操作系统给"打开的文件"发的唯一身份证号
1).没有句柄的情况
假设你有一个文件, 完整路径是"C:\Users\你的名字\Desktop\编程笔记.txt", 如果没有句柄, 每次想读/写这个文件, 都必
须完整写出这个长长的路径:
a.读文件: 读取("C:\Users\你的名字\Desktop\编程笔记.txt")
b.写文件: 写入("C:\Users\你的名字\Desktop\编程笔记.txt", 新内容)
c.关闭文件: 关闭("C:\Users\你的名字\Desktop\编程笔记.txt")
这样做的问题:
a.繁琐: 每次都要写超长路径, 效率低
b.易错: 路径多一个字符, 少一个反斜杠, 操作就会失败
c.难管理: 操作系统不知道你"打开了哪些文件", 无法统一管理
2).有句柄的情况
用open()函数打开文件时, 操作系统会
a.检测文件是否存在, 是否有权限操作该文件
b.给这个打开的文件文件分配一个数字代号(句柄), 比如3
c.返回这个句柄给使用者, 之后操作文件, 只需要用这个数字就行, 不用再写完整路径
int fd = open("C:\\Users\\你的名字\\Desktop\\编程笔记.txt", O_RDWR);
write(fd, "新的编程笔记内容", 16);
char buffer[1024];
read(fd, buffer, sizeof(buffer));
close(fd);
2.Socket句柄
Socket的设计思路和文件句柄完全一样, 核心是解决"网络通信参数太多, 管理麻烦"的问题
1).没有socket句柄的麻烦
网络通信需要的"参数"比文件路径更复杂
a.通信双方的IP地址(比如: 192.168.1.100)
b.双方的端口号(比如客户端8888, 服务器9999)
c.传输协议(TCP/UDP)
如果没有socket句柄, 每次发数据都要把这些信息全部带上, 操作系统没法统一管理这些连接

2).有句柄的情况
创建并建立Socket连接时, 操作系统会:
a.操作系统完成TCP(三次握手)或UDP初始化
b.将"Ip + 端口 + 协议"这些信息封装起来
c.分配一个Socket句柄(数字代号), 之后所有的网络操作, 只需要用这个句柄就行, 不再携带任何复杂参数
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
send(sockfd, "你好服务器", 8, 0);
char recv_buf[1024];
recv(sockfd, recv_buf, sizeof(recv_buf), 0);
close(sockfd);