套接字通信
TCP 通信流程
TCP 是一个面向连接的,安全的,流式传输协议,这个协议是一个传输层协议。
- 面向连接:是一个双向连接,通过三次握手完成,断开连接需要通过四次挥手完成。
- 安全:tcp 通信过程中,会对发送的每一数据包都会进行校验,如果发现数据丢失,会自动重传
- 流式传输:发送端和接收端处理数据的速度,数据的量都可以不一致
socket是插座,TCP客户端是插头,服务器先启动才能启动客户端
4.1 服务器端通信流程
1.创建用于监听的套接字,这个套接字是一个文件描述符
int lfd = socket();
监听是服务器用来检测有没有客户端发起一个新的连接,客户端和服务器的连接是由客户端发起,服务器需要通过一个套接字用来监测有没有新的客户端连接,
文件描述符是用来文件操作的。网络通信是网络IO(操作的内存)。磁盘文件的读写是文件IO(操作的磁盘文件)。
2.将得到的监听的文件描述符和本地的 IP 端口进行绑定
bind();
IP用来定位某一台主机,端口用来定位主机里的某一个进程。进程是服务器里的进程。
客户端在发数据的时候需要发送到服务器进程绑定的IP对应的端口上,这样客户端发送的数据就能被服务器的进程接收到。
3.设置监听
3.3 sockaddr 数据结构
// 在写数据的时候不好用 struct sockaddr { sa_family_t sa_family; // 地址族协议, ipv4 char sa_data[14]; // 端口(2字节) + IP地址(4字节) + 填充(8字节) } typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef uint16_t in_port_t; typedef uint32_t in_addr_t; typedef unsigned short int sa_family_t; #define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int)) struct in_addr { in_addr_t s_addr; }; // sizeof(struct sockaddr) == sizeof(struct sockaddr_in) struct sockaddr_in { sa_family_t sin_family; /* 地址族协议: AF_INET */ in_port_t sin_port; /* 端口, 2字节-> 大端 */ struct in_addr sin_addr; /* IP地址, 4字节 -> 大端 */ /* 填充 8字节 */ unsigned char sin_zero[sizeof (struct sockaddr) - sizeof(sin_family) - sizeof (in_port_t) - sizeof (struct in_addr)]; };
注意:存IP和端口的时候一定要先转换成大端,然后再把大端数据存储到结构体成员里
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)