embedded-framework/utils/TcpModule/readme.md
2024-08-11 15:57:17 +08:00

59 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# TCP模块
这个项目实现了一个用于网络通信的TCP模块提供了服务器和客户端功能。
在网络编程中套接字socket是一个用于网络通信的端点。在客户端和服务器模型中客户端会创建一个套接字来与服务器建立连接而服务器则监听来自客户端的连接请求。一旦连接建立客户端和服务器就可以通过各自的套接字进行数据的发送和接收。
# 涉及的知识
* 网络通信
* 多线程处理
* 回调函数
* C++/C
* I/O多路复用
* 套接字编程
* TCP协议
* 事件循环
# 各文件的作用
* **TcpModule.h**定义了TCP模块的公共接口和数据结构包括服务器和客户端参数结构体、回调函数类型等。
* **TcpModule.cpp**实现了TcpModule.h中定义的接口包括创建和释放TCP服务器和客户端的函数。
* **ITcpClient.h/ITcpClient.cpp**定义和实现了TCP客户端接口包括初始化、读取数据、写入数据和关闭连接等虚函数。
* **ITcpServer.h/ITcpServer.cpp**定义和实现了TCP服务器接口包括初始化、关闭服务器等虚函数。
* **TcpClientImpl.h/TcpClientImpl.cpp**实现了ITcpClient接口是TCP客户端的具体实现。
* **TcpServerImpl.h/TcpServerImpl.cpp**实现了ITcpServer接口是TCP服务器的具体实现。
* **TcpModuleMakePtr.h/TcpModuleMakePtr.cpp**提供了创建TCP服务器和客户端实例的工厂方法。
* **TcpServerHandle.h/TcpServerHandle.cpp**管理TCP服务器的实例提供了添加和获取服务器实例的方法。
* **TcpClientAcceptImpl.h/TcpClientAcceptImpl.cpp**实现了ITcpClientAccept接口处理客户端连接的接受和数据交换。
# 一些易混淆的点
1. 客户端创建的套接字包含指定`目标的IP地址和端口号`TcpClientImpl类中的init函数服务器创建的套接字只包含`本机IP地址和监听端口`。
2. 在网络编程中,服务器通常会在一个监听端口上等待来自客户端的连接请求。当服务器接受到一个连接请求时,它会创建一个新的套接字(或文件描述符)来表示这个新建立的连接,并且通常会为这个新的连接设置一系列的事件回调函数。
3. 客户端实例TcpClientImpl类对象进行init操作时会创建一个套接字并对目标服务器发出连接请求并启动事件循环Loop函数然后客户端实例会一直进行事件循环监听是否有读写操作直至连接关闭Close函数
# 该模块的实现过程
## 服务器端:
1. 创建服务器端套接字:使用 hloop_create_tcp_server 函数创建一个新的 TCP 服务器端套接字,并指定要监听的 IP 地址和端口号。
2. 设置回调函数:为服务器端套接字设置回调函数,包括:
on_accept当有新的客户端尝试连接时调用。
on_close当服务器端套接字关闭时调用。
3. 启动事件循环:使用 hloop_run 启动服务器的事件循环,等待客户端的连接请求。
4. 接受连接:在 on_accept 回调函数中,接受客户端的连接请求,并创建用于该连接的新套接字。
5. 创建客户端接受对象:为新的客户端连接创建一个 TcpClientAcceptImpl 对象,并设置相应的回调函数。
管理客户端连接:将新创建的客户端接受对象添加到管理容器中,以便跟踪和管理。
## 客户端:
1. 创建客户端套接字:使用 hio_create_socket 函数创建一个新的 TCP 客户端套接字。
2. 设置回调函数:为客户端套接字设置回调函数,包括:
on_connect当连接成功建立时调用。
on_close当连接关闭时调用。
on_message当接收到服务器发送的数据时调用。
3. 连接到服务器:使用 hio_connect 函数向服务器发起连接请求。
4. 启动事件循环:使用 hloop_run 启动客户端的事件循环,等待连接结果和数据传输。
5. 处理连接结果:在 on_connect 回调函数中处理连接结果,如果连接成功,可以开始发送和接收数据。