TCP 网络调试工具详细设计
需求分析:
- 用户界面需求
- 设计一个对话框界面,包含服务器和客户端的日志显示编辑框、连接列表、端口和 IP 地址输入框,以及启动服务器、连接、发送数据、清除日志等按钮。
- 为对话框添加系统菜单,包含 “About...” 菜单项。
- 支持最小化对话框,最小化时显示图标。
- 网络功能需求
- 实现 TCP 服务器和客户端的功能,支持服务器的启动和停止,客户端的连接和断开。
- 服务器能够监听指定端口,接受客户端连接,并处理客户端的数据。
- 客户端能够连接到指定 IP 地址和端口的服务器,并发送和接收数据。
- 日志记录需求
- 记录服务器和客户端的连接状态变化、数据收发信息,分别显示在对应的日志编辑框中。
- 支持清除服务器和客户端的日志记录。
- 端口和 IP 地址处理需求
- 获取本地主机名和 IP 地址,并显示在界面上。
- 允许用户输入远程服务器的 IP 地址和端口号。
- 验证用户输入的端口号是否在有效范围内(0 - 65535)。
- 连接列表管理需求
- 显示当前服务器的所有连接信息,包括 IP 地址和连接编号。
- 支持在连接状态变化时更新连接列表,如添加新连接、删除断开的连接。
- 允许用户点击连接列表中的项,选择要操作的连接。
- 数据发送需求
- 支持客户端和服务器发送数据,输入要发送的数据并点击相应的发送按钮即可发送。
- 发送成功后,在日志中显示发送信息。
- 状态回调需求
- 实现状态回调函数,处理服务器和客户端的连接状态变化,并更新界面显示。
- 实现数据回调函数,处理服务器和客户端接收到的数据,并更新日志显示。
- 快捷键屏蔽需求
- 屏蔽 Esc 和 Enter 键的默认功能,防止用户误操作导致对话框关闭。
- 资源管理需求
- 在对话框销毁时,释放服务器和客户端的套接字资源。
- 错误处理需求
- 在服务器和客户端操作出现错误时,弹出消息框提示用户,并显示错误信息。
详细设计
一、概述
本 TCP 网络调试工具旨在提供一个便捷的平台,用于测试和调试 TCP 网络通信。该工具支持服务器和客户端两种模式,允许用户在本地网络中进行数据的发送和接收,并实时监控网络连接状态和数据传输情况。
二、功能需求分析
2.1 服务器功能
- 启动和停止服务器:用户可以指定本地端口号,启动或停止 TCP 服务器。
- 监控客户端连接:实时显示已连接的客户端 IP 地址和连接状态。
- 接收客户端数据:接收并显示来自客户端的数据。
- 向客户端发送数据:用户可以选择已连接的客户端,向其发送数据。
- 断开客户端连接:用户可以选择已连接的客户端,断开与其的连接。
2.2 客户端功能
- 连接和断开服务器:用户可以指定远程服务器的 IP 地址和端口号,连接或断开与服务器的连接。
- 接收服务器数据:接收并显示来自服务器的数据。
- 向服务器发送数据:用户可以输入数据,向服务器发送。
2.3 日志记录功能
- 服务器日志:记录服务器的连接状态变化、接收和发送的数据。
- 客户端日志:记录客户端的连接状态变化、接收和发送的数据。
三、系统架构设计
3.1 整体架构
本工具采用 MFC(Microsoft Foundation Classes)框架开发,主要由以下几个模块组成:
- 界面模块:负责与用户交互,显示界面元素,处理用户输入。
- 网络模块:负责 TCP 网络通信,包括服务器的创建、监听、客户端的连接、数据的发送和接收等。
- 日志模块:负责记录服务器和客户端的日志信息,并显示在界面上。
3.2 类设计
3.2.1 CTCPNetKitDlg
类
- 功能:作为主对话框类,负责界面的初始化、消息处理和与用户的交互。
- 主要成员变量:
m_psockServer
:服务器套接字对象。m_psockClient
:客户端套接字对象。m_strLocalIP
:本地 IP 地址。m_strLocalName
:本地主机名。m_nPortLocal
:本地端口号。m_nPortRemote
:远程端口号。m_nCurrentSelect
:当前选中的客户端索引。m_strRemoteIP
:远程服务器 IP 地址。m_bServerCreated
:服务器是否已创建。m_bClientConnected
:客户端是否已连接。
- 主要成员函数:
OnInitDialog()
:初始化对话框界面。OnStartServer()
:启动或停止服务器。OnConnect()
:连接或断开与服务器的连接。OnClientSend()
:客户端发送数据。OnServerSend()
:服务器向客户端发送数据。OnServerDisconnect()
:断开与客户端的连接。OnStatusChangedMsg()
:处理连接状态变化消息。OnDataArrivedMsg()
:处理数据到达消息。
3.2.2 CTCPSocket
类
- 功能:封装 TCP 套接字操作,提供服务器和客户端的网络通信功能。
- 主要成员变量:
m_nType
:套接字类型(服务器或客户端)。m_sSocket
:套接字描述符。m_bAvailable
:套接字是否可用。m_bCreated
:套接字是否已创建。m_bAuto
:是否自动接收数据。m_dwUserData
:用户数据。m_nPort
:端口号。m_hServerThread
:服务器线程句柄。m_hServerDataThread[MAX_CONNECTION]
:服务器数据接收线程句柄数组。m_sServer[MAX_CONNECTION]
:服务器套接字数组。m_cIp[MAX_CONNECTION][16]
:客户端 IP 地址数组。m_bConnected[MAX_CONNECTION]
:客户端连接状态数组。m_nConnections
:连接的客户端数量。m_nCurrent
:当前处理的客户端索引。m_lpServerDataArriveProc
:服务器数据到达回调函数。m_lpServerStatusProc
:服务器状态变化回调函数。m_hClientThread
:客户端线程句柄。m_lpClientDataArriveProc
:客户端数据到达回调函数。m_lpClientStatusProc
:客户端状态变化回调函数。
- 主要成员函数:
CreateServer()
:创建服务器套接字。StartServer()
:启动服务器监听。StopServer()
:停止服务器监听。Listen()
:监听客户端连接。ReceiveServer()
:接收服务器数据。SendServer()
:向客户端发送数据。Disconnect()
:断开与客户端的连接。Connect()
:连接到服务器。StartReceiving()
:开始自动接收数据。StopReceiving()
:停止自动接收数据。ReceiveClient()
:接收客户端数据。SendClient()
:向服务器发送数据。Close()
:关闭套接字。
四、详细设计
4.1 界面设计
4.1.1 主界面布局
- 本地 IP 地址和端口号输入框:用于输入本地服务器的 IP 地址和端口号。
- 远程 IP 地址和端口号输入框:用于输入远程服务器的 IP 地址和端口号。
- 启动服务器按钮:用于启动或停止服务器。
- 连接按钮:用于连接或断开与服务器的连接。
- 服务器日志显示框:显示服务器的连接状态变化、接收和发送的数据。
- 客户端日志显示框:显示客户端的连接状态变化、接收和发送的数据。
- 发送数据输入框:用于输入要发送的数据。
- 发送按钮:用于发送数据。
- 已连接客户端列表框:显示已连接的客户端 IP 地址和连接状态。
4.1.2 界面交互流程
- 启动服务器:用户输入本地端口号,点击 “启动服务器” 按钮,调用
CTCPNetKitDlg::OnStartServer()
函数,创建并启动服务器。 - 连接服务器:用户输入远程 IP 地址和端口号,点击 “连接” 按钮,调用
CTCPNetKitDlg::OnConnect()
函数,连接到服务器。 - 发送数据:用户输入要发送的数据,点击 “发送” 按钮,调用
CTCPNetKitDlg::OnClientSend()
或CTCPNetKitDlg::OnServerSend()
函数,发送数据。 - 断开连接:用户点击 “断开连接” 按钮,调用
CTCPNetKitDlg::OnConnect()
或CTCPNetKitDlg::OnServerDisconnect()
函数,断开连接。
4.2 网络模块设计
4.2.1 服务器模式
- 创建服务器套接字:调用
CTCPSocket::CreateServer()
函数,创建服务器套接字并绑定到指定端口。 - 启动服务器监听:调用
CTCPSocket::StartServer()
函数,创建一个线程,开始监听客户端连接。 - 处理客户端连接:在
CTCPSocket::ServerThread()
函数中,使用accept()
函数接受客户端连接,创建一个新的线程处理该客户端的数据接收。 - 接收客户端数据:在
CTCPSocket::DataThread()
函数中,使用recv()
函数接收客户端数据,并调用回调函数通知主界面。 - 发送数据到客户端:调用
CTCPSocket::SendServer()
函数,向指定客户端发送数据。
4.2.2 客户端模式
- 连接到服务器:调用
CTCPSocket::Connect()
函数,连接到指定的服务器。 - 开始自动接收数据:调用
CTCPSocket::StartReceiving()
函数,创建一个线程,开始自动接收服务器数据。 - 接收服务器数据:在
CTCPSocket::ClientThread()
函数中,使用recv()
函数接收服务器数据,并调用回调函数通知主界面。 - 发送数据到服务器:调用
CTCPSocket::SendClient()
函数ÿ