这个项目写的并不好….自己写项目的时候状态也很糟糕…会在后续部分继续完善这些内容
随着现代通信的发展,很多聊天工具都开始流行,在此趋势之上开始写的基于Linux平台下的聊天工具,目前已经实现了部分的通信功能,会在后续继续完善实现.
实现的功能有:
所有的菜单都是以自己封装的getch函数来实行方向键,在一定程度上提高了界面的友好性,emmmmmmm虽然也造成了很多的问题,看起来似乎是值得的.
序号 | 术语 | 说明性定义 |
---|---|---|
1 | C/S | Client/Server模型 |
2 | epoll | Linux下处理大批量的文件描述符的API |
3 | makefile | Linux下进行工程构建的文件 |
4 | mysql | 用于存储大量数据的工具 |
在进行该项目的实现时,也查阅了很多的资料
a.相关类型的书籍
书籍 | 作者 |
---|---|
< Linux_C编程实战 > | 董永清 |
< 鸟哥的Linux私房菜(第三版) | VBird |
CSDN博文 |
b.查阅的相关的博客,网上资料
资料名 | 作者 |
---|---|
(笔记)Linux下网络编程,采用TCP协议实现的C/S架构 | fly_chen |
IO复用之——epoll | 敲完代码好睡觉zzz |
socket通信简介 | 小伟哥 |
开发环境: Fedora 4.17.3-100.fc27.x86_64
开发工具: Vim及VSCode,gcc编译器
绘图工具: ProcessOn
局域网/外网
需要把自己的数据库和数据库密码进行修改
在这里客户端连接的ip地址应该为
执行ifconfig 然后得到的ip地址,因为处于不同的网络,ip地址可能是不相同
需要安装mysql 数据库
在fedora27上的安装方法为 :
添加源 : dnf install https://dev.mysql.com/get/mysql57-community-release-fc27-10.noarch.rpm
3b.更新或安装MySQL8.0.4
dnf --enablerepo=mysql80-community install mysql-community-server
4.开启MySQL服务并且启动时自动启动MySQL
systemctl start mysqld.service ## 更新后重新启动服务
systemctl enable mysqld.service
5.获取您生成的随机root密码
grep 'A temporary password is generated for root@localhost' /var/log/mysqld.log |tail -1
输出例子:
2015-11-20T21:11:44.229891Z 1 [Note] A temporary password is generated for root@localhost: -et)QoL4MLid
你的root随机密码就是:-et)QoL4MLid
6.登录MySQL并且修改root密码
mysql -u root -p
使用刚才的随机密码登录
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
把密码进行修改
在使用的时候需要
#include < mysql/mysql.h>
所以需要安装依赖包才行
sudo dnf instal libmysqlclient-dev
数据库中的表可以参考我的github上所建立的表里面有mysql.sql,当然也可以自己建立
本项目中主要是进行线程,进程,网络编程知识,mysql的综合运用
所涉及到的数据结构并不是很多,主要是以下:
数据结构 | 使用 |
---|---|
链表 | 链表主要是在Server端使用,我在这里使用了链表存储了当前所连接到服务器中的所有用户,也在client端进行了使用,主要用于存储了消息盒子 |
本程序主要是以包传递的方式来进行编写的,传递结构体,自己封装了getch函数,让菜单以方向键的形式,自己封装了recv函数和send函数,防止意外情况并没有读取完毕
此模块是进行Client总体控制的main模块
此模块是Client进行接收包的recv模块,负责消息的接受。
此模块是进行Client聊天室的主体控制程序模块
此模块是表示My_chatting聊天室的好友聊天的板块
此模块是表示群组聊天的板块
此模块是Server总体控制的main模块
此模块是Server进行事件管理的重要的epoll模块
此模块是Server进行事件处理的模块
文件名 | 文件描述 |
---|---|
system_log | 存储服务器的日志,发生的状态 |
chat_record | 存储消息记录 |
friends_number | 存储好友列表和状态 |
group_name_number | 表示谁建立的哪个群 |
off_line_record_number | 表示谁的离线消息和记录 |
group_number | number所加入的群列表 |
users | 表示服务器中的所有用户 |
1.关于自己写的方向键,造成的缓冲区问题
解决方案:对缓冲区进行及时的操作
使用getchar()或者其他的清除缓冲区的方式
int getch1() //已经封装好的getch函数
{
int c = 0;
int res = -1;
struct termios org_opts, new_opts;
res = tcgetattr(STDIN_FILENO, &org_opts);//设置终端的属性
assert(res == 0);
memcpy(&new_opts, &org_opts, sizeof(org_opts));
new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE);
tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);
c = getchar();
res = tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);
assert(res == 0);
return c;
}
2.在其他方面因为数据库中表的规划的失误,导致操作不合逻辑,比如好友状态的改变,需要每次从数据库中读取,在有的地方没有进行错误提示消息
解决方法:将好友状态等改为用链表存储,方便管理
3.服务端,epoll多线程造成的发文件死锁问题
解决方法:epoll多线程的架构问题,应该是先接收,根据接收的标志位来进行处理并且创建线程,在多次发送文件的时候,应该实行文件同步问题,可以采用pthread_join ()或者加锁或者pthread_detach(),来进行线程的同步
4.发送文件的时候会创建很多线程,如果内存不够大的时候会有一些影响甚至发生死锁问题
解决方法:在shell终端上使用ulimit -a 来查看线程 栈的大小,可以根据自己的值来改变 使用ulimit -s 来进行改变,这样的话会可以创建更多的线程
问题1:不合理的结构
解决方案:结构体的成员应该分离,不应该添加的过多,epoll的多线程的结构应该进行改变,还有好友的状态应该由链表来进行维护
问题2:对于不合理的输入
解决方案:仍然需要继续进行非法输入的处理,对ctrl+c进行处理