具备注册账号,群聊,查看在线人员信息,私发文件和接收文件功能,因为每个客户端只有一个属于自己的socket,所以无论客户端是发聊天消息还是文件都是通过这一个socket发送,

这也意味着服务器收发任何消息或文件都只能有一个select函数也意味着只能有一个收发消息的线程。

所以我定义了一个通用结构体:

struct snd{

char msg[30];    //消息性质,同时也是普通聊天消息..

int soc;        //套接字

int count;        //用户账号

char filename[20];    //文件发送时的文件名

int size;        //文件大小

char buffer[1024];    //每次fread读取文件时的大小

};

第一个字符串msg时用来保存消息的性质,是聊天消息 还是文件发送消息 还是菜单命令消息,我的处理方法有点"偷懒",应该是有点蠢..

因为文件发送时msg保存的字符串就是"FILE",服务器只要判断它的字符串是"FILE"就认为它时文件消息并把它转发给指定客户端。

而msg[30]在结构体是聊天消息的情况下保存的就是聊天的消息,如果msg不是我指定的字符串的话服务器就会把它当聊天消息转发,所以如果我在聊天室输入"FILE"并发送…你懂的,BUG就出现了。

收发文件我是在服务器收发线程中加入文件收发的函数,判断收到的是文件就跳入此函数,所以可能会出现两个客户端发送接收文件时其他客户端群聊消息接收有延迟,不过我没测试过….

瑕疵很多,还有很多需要改进的地方,望各位前辈海涵。

上代码:

服务器↓

客户端↓

最新文章

  1. Linux Linux程序练习十七
  2. web前端基础知识-(一)html基本操作
  3. mongodb使用和下载
  4. POJ2553
  5. javascript拾掇
  6. 最长子串 FZU2118
  7. JVM的回收实现
  8. C# MVC 实现登录的5种方式
  9. JavaWeb学习记录(二十七)——定时发送邮件ServletContextListener监听实现
  10. wampserver修改mysql数据库密码后phpMyAdmin无法连接数据库
  11. Google的代码风格规范,各种语言都很全
  12. 图像载入 imread()[OpenCV 笔记4]
  13. ios复制到剪贴板
  14. dom4j之小小工具
  15. 用Volume在主机和Docker容器文件传输
  16. python调用远程chromedriver.exe、selenium抓包方法
  17. PairProject 电梯调度 【附加题】
  18. 6-Python3从入门到实战—基础之数据类型(元组-Tuple)
  19. WPF获取当前用户控件的父级窗体
  20. 二十、MVC的WEB框架(Spring MVC)

热门文章

  1. Azure 中 Linux 虚拟机的大小
  2. SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)
  3. mongodb数据库备份恢复-windows系统
  4. Excel使用SUMIF函数注意事项
  5. Webpack笔记(二)——搭建React开发环境
  6. 文件是数据(字节)流的抽象-为什么C++中会把文件操作抽象为fstream?
  7. BZOJ2431:[HAOI2009]逆序对数列(DP,差分)
  8. thrift C++ Centos 安装
  9. MFC中用户自定义类响应自定义消息
  10. 【绝迹篇】C#RSA算法实现