目录

  • 一、功能说明
  • 二、Bug集中营
    • 2.1 关于群聊的问题
    • 2.2 关于私聊的问题
    • 2.3 关于用户名的问题
    • 2.4 关于客户端界面的问题
      • 2.4.1 时间显示问题
      • 2.4.2 握手消息问题
    • 2.5 关于客户端退出的问题
      • 2.5.1 客户端退出后,服务器如何向其他用户通知
      • 2.5.2 如何保证某个客户端退出后,其他客户端信息接收的有效性
  • 三、效果展示
  • 四、程序代码

欢迎大家点击链接,查看本项目的 ✌说明文档✌

一、功能说明

实现的功能

  1. 客户端之间的群聊功能已经实现
  2. 实现了使用用户名标识的私聊功能
  3. 某个客户端退出后,其余客户端依然可以正常通信
  4. 优化了客户端界面
  5. 录制了测试视频并投稿至B站

具体操作内容概述
本程序代码继承自上一次嵌入式作业,主要做了以下改动

  • 客户端
  1. 将握手函数拆分为数据发送函数和数据接受函数,提高函数复用率。
  2. 使用父子进程的方式实现了群聊功能,实现了避免产生孤儿进程的功能。
  3. 编写数据过滤函数,将私信数据的目标PID和私信消息过滤。
  • 服务器
  1. 服务器将现存客户端数量、客户端的PID以及用户名都做记录
  2. 编写服务器的数据发送函数,能够实现不将数据发给发来数据的客户端,此部分代码已被注释(觉得暂时没用)。实现了私发功能。

二、Bug集中营

2.1 关于群聊的问题

  • 问题描述
    刚刚遇到一个问题: 当第二个客户端连接进来之后,服务器就会依次向所有客户端发送相关信息。但是,此时第一个客户端正处在发送数据的情况下。也就是说,此时如果客户端1不能发送数据给服务器,那么此时服务器发给客户端1的信息就会被阻塞。这就导致其他所有客户端都不能接收到服务器的此条信息了。

  • 问题原因
    该问题最根本的原因是,客户端的读写是顺序执行的,他只能写完数据之后才能有机会读数据。这就导致他写(公有管道)数据的时候,读(私有管道)被阻塞了。

  • 解决方案
    如果要解决该问题,我觉得 必须 有必要采用父子进程的方式。这样就会解决读写顺序的问题。

PS: 本以为该问题很棘手,需要大量修改代码

Linux 命名管道 聊天室相关推荐

  1. Linux多人聊天室之后篇

    文章目录 前言 一.前期工作 二.项目框架 三.伪代码流程 四.源代码 五.结果显示 附录 前言 本文承接上一篇<Linux多人聊天室之前篇>的内容,记录的是多人聊天室室如何实现的. 一. ...

  2. linux命名管道 c版本 python版本

    一.什么是命名管道 命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没有名字的管道(匿名管道)类似. 由于Linux中所有的事物都可被 ...

  3. linux命名管道进程间通信,《Linux 进程间通信》命名管道:FIFO

    命名管道的主要用途:不相关的进程之间交换数据. 命令行上创建命名管道: $ mkfifo filename 程序中创建命名管道: #include #include int mkfifo(const ...

  4. 基于Linux实现的聊天室小程序

    基于linux平台制作的简单聊天室程序,可以通过修改宏定义USER_LIMIT进而修改支持的用户个数 不涉及任何外部库,直接g++编译即可 涉及到:socket编程,零拷贝文件描述符数据splice, ...

  5. linux大作业聊天室报告,Linux聊天室系统期末大作业.docx

    NANCHANG UNIVERSITY <Linux 系统编程>课程设计 题目:Linux 聊天室报告 学院:软件学院 专业:计算机软件 班级:计软 121 班 姓名:李俊楠 起讫日期: ...

  6. Linux多人聊天室之前篇

    文章目录 前言 一.聊天模式框架 二.代码 三.结果显示: 四.网络编程通用API汇总 前言 本文的内容是多人聊天室的前期工作,记录的是一个客户端和一个服务端聊天,尚未涉及到多线程.若想看多线程的内容 ...

  7. linux命名管道通信方式图例,linux IPC 命名管道

    在前面一篇文章中[Linux进程间通信] - 匿名管道中,我们介绍了Linux/Unix系统中最古老的一种进程间通信方式 – 匿名管道.此外,我们也讲解了匿名管道的几个局限性,特别是匿名管道只能用于父 ...

  8. linux下多进程聊天室,从0实现基于Linux socket聊天室-多线程服务器模型-1

    前言 Socket在实际系统程序开发张中,应用非常广泛,也非常重要.实际应用中服务器经常需要支持多个客户端连接,实现高并发服务器模型显得尤为重要.高并发服务器从简单的循环服务器模型处理少量网络并发请求 ...

  9. linux 命名管道通信速度,《Linux 进程间通信》命名管道:FIFO

    命名管道的主要用途:不相关的进程之间交换数据. 命令行上创建命名管道: $ mkfifo filename 程序中创建命名管道: #include #include int mkfifo(const ...

最新文章

  1. 人工智能会取代科学家吗
  2. Redis的三种启动方式【转】
  3. 【控制】《多无人机协同控制技术》周伟老师-第2章-多无人机协同控制体系结构
  4. (原) ora-12705 cannot access nls data files or invalid environment specified
  5. numpy 平方_NumPy入门指南
  6. android+apk启动过程,Android Apk的运行过程(一)—— Activity启动与页面事件传递...
  7. 【zookeeper】zookeeper 脑裂问题
  8. Silverlight实用窍门系列:27.Silverlight二维旋转+平面渐变+动画,模拟雷达扫描图之基本框架【附带源码实例】...
  9. java定时功能分析
  10. 设计模式学习每天一个——Adapter模式
  11. 将MNIST数据集转化为png文件
  12. 算法之二叉树各种遍历
  13. GIS 如何求多边形的内接最大圆
  14. 计算机考试成绩分析汇报,计算机考试成绩分析与总结.doc
  15. 经济学的思维方式 [Basic Economics A Common Sense Guide to the Econom]
  16. python笔记11 - lambda函数,globals()/locals()函数,eval()exec()函数,闭包函数,函数式编程,高阶函数
  17. SDN网络的本质特点
  18. Java Socket详解+基础模板+各种常见问题+端口映射
  19. 常系数非齐次微分方程特解及其通解求解
  20. openid无效什么意思_“洋河年份原浆”商标被驳回,为什么古井贡酒坐不住了?...

热门文章

  1. A Vertical Kelvin Test Structure for Measuring the True Specific Contact Resistivity
  2. CSS:div中文字换行设置
  3. 一线城市初次租房防坑指南
  4. 非正式纳新题解(C语言)
  5. Windows 11 即将发布,微软欲“强推” Edge 浏览器?
  6. 利用jsoup爬取百度网盘资源分享连接(多线程)
  7. 【220】【3】滑动窗口(双指针)的应用,另有序的容器应用
  8. 「镁客·请讲」bitBerg杨坤:冰山下藏着的是VR游戏的未来
  9. ToString数据如何反序列化
  10. 使用电信云时做对象储存时的异常信息:com.amazonaws.services.s3.model.AmazonS3Exception