Skip to content

Latest commit

 

History

History
30 lines (17 loc) · 2.26 KB

Day6.md

File metadata and controls

30 lines (17 loc) · 2.26 KB

文件说明

  • 文件创建时间:2020年04月14日
  • 最后修改时间:2020年04月14日
  • 文件主要内容:遇到的问题、解决方案

Bug集中营

昨天QT搞得我很难受,今天想了一下本程序能优化的地方。首先是客户端退出的问题,然后是消息循环发送的问题。

问题一、客户端退出后,服务器向其他用户通知

  • 问题描述

现在的程序逻辑是这样的:当某个客户端要退出时,需要向服务器发送一个CLIENT_QUIT信息。服务器收到该信息后,切断该客户端的私有管道,删除私有管道文件。然后客户端数量的标识Client_Number减一。就完事了。 如果是现在这样处理的话,当某个客户端退出后,其他用户是不知道该客户端的退出的。这就不太好。。。

  • 解决方案

我的解决方案是:当某个客户端退出后,服务器同样做之前的动作(切断该客户端的私有管道、删除私有管道文件、客户端数量减一),同时,服务器也要向所有客户端广播消息,告诉其他用户,该客户端已退出。这里的关键问题就是如何判断客户端退出,我是设了一个标识位Quit_Flag,用标识位做判断,控制服务器广播的内容。具体内容可以看一下Server_Send_Message()函数。

问题二、如何保证某个客户端退出后,其他客户端信息接收的有效性

  • 问题描述

在解决第一个问题后,一个隐藏的问题就被暴露出来了。由于程序中对客户端信息的存储,是顺序排放在数组中的,而当某个客户端退出后,该位置的信息没有被删除,客户端数量却减了一。这就导致,循环发送信息时,最后加进来的客户端,一定收不到信息。简言之,某个客户端退出后,后面客户端对广播消息的接受会有异常。

  • 解决方案

之所以有这样的问题,根本原因是,服务器没有把已退出客户端的信息删除。解决办法也很简单,当某个客户端退出后,服务器把Client_PID_Box数组以及Client_Name_Box数组中的内容重新排序。实际上是,把该客户端后面的所有客户端信息,都往前移动一位。我写了个简单的Delete_Client_Data函数,实现了该功能。