小白学习linux网络编程的第一个项目

基于linux C++聊天室程序

最近在网上找到了一个聊天室的程序,然后看得差不多了,想着给它添加了注册登录功能和将聊天内容保存到文件夹,其中注册登录得账号和密码使用了mysql保存到了数据库中,每次登录都会在数据库中查询账号密码是否正确。程序本身较简单,每个知识点的使用也很简单,仅记录一下C++网络编程入门使用的。因原始代码出处找不到了,如果部分代码侵权联系删除。

程序中涉及到的知识点

socket,MYSQL ,epoll,管道,STL,多进程

使用的运行环境

Linux Ubuntu1804 (需要安装mysql,mysql中需要有数据库chat,里面包含表logMsg,表内两列数据,num(int)和password(char))

运行前须知:

在Client.cpp中,连接数据库我用的root账号,如果你的mysql账号也为root账号,chatroom_client运行前先要su root,否则输入账号密码后,因无法查询数据库导致程序运行失败。如果数据表中无账号密码数据,可以进入数据库中手动添加或者运行程序时选择注册账号。

运行步骤

1、执行make命令,编译程序
2、将终端窗口分成多个区域(建议4个,我用的terminal)方便运行多个程序
3、第一个窗口运行 ./chatroom_server
4、第二个窗口运行 ./chatroom_client
5、第三个窗口运行 ./chatroom_client
6、第四个窗口可以用来查看chatFile.txt或者数据库中存储的账号密码

文件组成

Common.h:包含了客户端和服务器都需要用到的头文件、宏定义、函数、结构体
Client.h:包含Client类的声明
Client.cpp:Client类的实现
ClientMain.cpp:创建一个Client对象,并开始执行
Server.h:包含Server类的声明
Server.cpp:Server类的实现
ServerMain.cpp:创建一个Server对象,并开始执行
chatFile.txt:记录聊天内容到文件
makefile:编译指令

程序大概讲解

服务器端:
1、首先定义一个epoll_event类型的结构体用来存放事件
创建一个监听套接字,创建epoll句柄用来监听事件,将监听套接字关联到创建的
epoll中。打开chatFile.txt文件,当有消息经过服务器,就会被记录到文件。
2、进入监听循环,获取监听到的事件数目,然后按顺序处理监听到的事件,
如果事件请求连接,那就连接该客户端,并将该客户端的套接字句柄挂到epoll上
然后将该客户端的句柄添加到存储客户端句柄的list中,此list将在广播发送时起作用。
3、如果epoll监听到的事件不是请求连接的事件,那就调用广播发送函数,进入
SendBroadcastMessage()函数,将该客户端句柄传入该函数,调用socket中recv()
函数,接收客户端的数据,数据的前三位代表账号信息,先处理数据得到账号。
4、如果list链表长度为1,那说明当前聊天室只有一人,提示用户当前仅他自己
否则循环遍历链表将数据发送给出了本身外的所有客户端,同时聊天记录保存到文件
5、程序回到主循环中,继续监听事件
客户端
1、选择登录或者注册账号,
如果选择注册账号:进入regUser()函数,系统会自动分配一个账号(账号=数据库中
最后一个账号+1),然后由用户输入密码,该账号和密码会保存到数据库中。进入登录
登录账号:输入账号和密码,然后在数据库中查询账号和密码是否匹配,确认登录
2、定义epoll_event类型的结构体用来存放事件
3、进入Connect()函数,完成与客户端的连接。创建socket,连接服务器,创建管道
使用epoll_create()创建epoll来监听事件,将创建的socket和管道读端挂epoll上
4、使用fork()函数创建子进程,两个进程同时运行,各自负责自己的事情
子进程:负责得到用户输入的数据,首先关闭管道的读端fd[0],使用标准输入流stdin
获取输入的数据,该数据如果时exit就退出,否则使用write()函数将数据写入管道
父进程:负责和服务器进行通信,首先关闭管道的写端fd[1],获取监听数目,然后
按顺序处理事件,当事件是连接服务器时,就接收服务器的提示信息,并输出。
否则事件就是子进程的管道事件,读取数据发送到服务器

代码下载

github下载地址:(https://github.com/Shuaiqiang1998/chatroom/).
CSDN下载地址link.

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值