1.简介

C++代码,TCP协议实现局域网聊天系统(长链接),有日志的打印,实现登录注册以及单发信息和群发信息功能,工作业余时间所写,附上github地址里面有Readme说明文件
说明:登录注册时客户端将用户输入的信息发送给服务器让服务器进行处理,客户端通信时为客户端先将信息发送给服务器,然后让服务器转发
由于代码文件过多代码过长,下面仅展示服务器和客户端代码,整个工程代码请在以上Github地址自取

2.服务器Select部分相关代码

bool Server::SelectClient()
{int result = 0;//先清空集合,再将套接字加入集合FD_ZERO(&mSet);FD_SET(mSocketfd, &mSet);mMaxfd = mSocketfd;while(!mIsStop){mReadset = mSet;LOG(TAG, "select ...");result = select(mMaxfd + 1, &mReadset, NULL, NULL, NULL);if(result < 0){LOGE(TAG, "select failed ...");return false;}//如果该套接字在此集合内则进行accept操作,并创建客户端链表if(FD_ISSET(mSocketfd, &mReadset)){mAddrlen = sizeof(mCaddr);LOG(TAG, "accept ...");mAcceptfd = accept(mSocketfd, (sockaddr *)&mSaddr, (socklen_t *)&mAddrlen);if(mAcceptfd < 0){LOGE(TAG, "accept failed ...");return false;}LOG(TAG, "client ip = ", inet_ntoa(mSaddr.sin_addr));LOG(TAG, "client port = ", ntohs(mSaddr.sin_port));//将accept返回的描述符加入集合FD_SET(mAcceptfd, &mSet);if(mMaxfd < mAcceptfd){mMaxfd = mAcceptfd;}//以头插法创建客户端链表mNode = (ClientNode *)malloc(sizeof(ClientNode));if(!mNode){LOGE(TAG, "malloc failed ...");return false;}mNode->fd = mAcceptfd;mNode->caddr = mCaddr;mNode->next = mHead;mHead = mNode;}//遍历客户端链表for(mNode = mHead ; mNode != NULL; mNode = mNode->next){mTempfd = mNode->fd;if(!FD_ISSET(mTempfd, &mReadset)){continue;}//开始读取客户端信息,拆包判断Package pack;result = read(mTempfd, &pack, sizeof(Package));if(result < 0)//此时移除下线节点{LOGE(TAG, "read error or TCP broken ...");RemoveUnlineUserNode(mTempfd);close(mTempfd);FD_CLR(mTempfd, &mSet);               break;}else if(result == 0)//此时移除下线节点{LOGE(TAG, "TCP broken ...");RemoveUnlineUserNode(mTempfd);close(mTempfd);FD_CLR(mTempfd, &mSet);                break;}int online = 0;bool IsBreak = false;switch(pack.type){case REGISTER://当包头表示注册信息时result = read(mTempfd, &mRegistinfo, sizeof(RegisteInfo));if(result < 0){LOGE(TAG, "read error ...");return false;}LOG(TAG, "read your name = ", mRegistinfo.name);LOG(TAG, "read telphone  = ", mRegistinfo.telphone);LOG(TAG, "read password  = ", mRegistinfo.password);LOG(TAG, "and your id is : ", mTempfd); mRegistinfo.id = mTempfd;if(mStorage){bool ret = mStorage->WriteToMysql(mRegistinfo);if( !ret ){WriteData(RFAILED);}else{WriteData(RSUCCESSED);}}else{LOGE(TAG, "don't save to mysql because of connect mysql error ...");}                    break;case LOGIN://当包头表示登录信息时result = read(mTempfd, &mLogininfo, sizeof(LoginInfo));if(result < 0){LOGE(TAG, "read error ...");return false;}LOG(TAG, "Login username = ", mLogininfo.name);LOG(TAG, "Login password = ", mLogininfo.password);if(mStorage){bool ret = mStorage->ReadFromMysql(mLogininfo.name, mLogininfo.password);if(ret)//登录成功{WriteData(LSUCCESSED);//登录成功则将该用户加入链表CreateUserNode(mTempfd, mLogininfo.name);                       }else//登录失败{WriteData(LFAILED);}}else{LOGE(TAG, "don't read mysql because of connect mysql error ...");}      break;case GETONLINEUSER://当包头表示获取在线用户链表时result = read(mTempfd, &online, sizeof(int));if(result < 0){LOGE(TAG, "read get online user commond error don't send online usernode...");return false;}else{LOG(TAG, "read commond = ", online);//发送在线用户链表WriteData();}          break;case MESSAGE://先接收信息在转发DealMessage();break;case ZERO:IsBreak = true;break;}if(IsBreak){break;}}        }return true;
}

2.客户端相关代码

bool Client::Init()
{int result = 0;mIsStop = false;signal(SIGPIPE, RecvSignal);SetIPandPort();LOG(TAG, "socket ...");mSocketfd = socket(AF_INET, SOCK_STREAM, 0);if(mSocketfd < 0){LOGE(TAG, "socket failed ...");return false;}mSaddr.sin_family = AF_INET;mSaddr.sin_port = htons(mPort);mSaddr.sin_addr.s_addr = inet_addr(mIp);LOG(TAG, "connect ...");result = connect(mSocketfd, (sockaddr *)&mSaddr, (socklen_t)sizeof(mSaddr));if(result < 0){LOGE(TAG, "connect failed ...");return false;}return true;
}void Client::DeInit()
{mIsStop = true;
}void Client::SetIPandPort()
{char select[12];char ip[20];system("clear");LOG(TAG, "默认连接的IPV4 = ", mIp);LOG(TAG, "默认连接的Port = ", mPort);LOG(TAG, "是否更改连接的ip及port(yes/no)?");LOGI(select);if(0 == strcmp(select, "yes") || 0 == strcmp(select, "YES")){LOG(TAG, "请输入新IPV4:");LOGI(ip);//mIp = ip;mIp = new char[20];strcpy(mIp, ip);LOG(TAG, "请输入新PORT: ");LOGI(&mPort);}else{LOG(TAG, "连接默认的ip地址和端口");sleep(1);return ;}LOG(TAG, "当前连接的IPV4 = ", mIp);LOG(TAG, "当前连接的Port = ", mPort); sleep(1);
}bool Client::Connect()
{bool result = true;result = Init();if(!result){LOGE(TAG, "init socket error can't connect ...");return false;}else{return true;}return true;
}void Client::DisConnect()
{close(mSocketfd);
}

3. 运行图

Linux下Vim编辑Gcc编译实现局域网聊天系统相关推荐

  1. Linux下make使用gcc编译,Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入)

    一.确认已经装好了GCC和Make的软件包 可以使用whereis命令查看: 如果whereis  gcc和whereis  make命令有结果,说明安装了这两个软件,可以继续往下做. 二.使用GCC ...

  2. linux下vim编辑退出命令

    编辑完保存退出的四种方式         1. Esc+:+wq+回车(w是write,q是quit)         2. Esc+:+x+回车(x=wq)         3. Esc+shift ...

  3. linux 编辑文件乱码,Linux 下 vim 编辑文件,解决中文乱码,设置Tab键空格数

    HTML5 图片本地压缩上传插件「localResizeIMG」 移动应用中用户往往需要上传照片,但是用户上传的照片尺寸通常很大,而手机的流量却很有限,所以在上传前对图像进行压缩是很有必要的. 原生应 ...

  4. Linux下C/C++程序编译链接加载过程中的常见问题及解决方法

    Linux下C/C++程序编译链接加载过程中的常见问题及解决方法 1 头文件包含的问题 报错信息 该错误通常发生在编译时,常见报错信息如下: run.cpp:2:10: fatal error: dl ...

  5. 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。

    在Linux下如何使用GCC编译程序.简单生成 静态库及动态库.   本文适用于Linux下开发初学者.本文初步讲解在Linux下如何使用GCC编译程序.简单生成静态库及动态库. 一.关于安装.一般系 ...

  6. linux 下vim的使用(学习必看!!重要)

    vi与vim vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器.他是我们使用Linux系统不能缺少的工具.由于对 ...

  7. Linux下boost库的编译、安装详解

    1.下载源文件 去官网下载:http://www.boost.org/ 这里下载最新版本 wget https://dl.bintray.com/boostorg/release/1.64.0/sou ...

  8. sublime连接Linux进行vim编辑

    sublime连接Linux进行vim编辑 文章目录 题外话: sublime下载 sublime破解方法 sublime连接linux 1.远程连接配置 2.建立本地远程连接文件夹 3.编辑linu ...

  9. linux怎么设置自动缩进,配置Linux下vim自动缩进等功能

    从终端打开配置文件: vim ~/.vimrc 添加如下代码: set tabstop=4 set softtabstop=4 set shiftwidth=4 set autoindent set ...

最新文章

  1. 为什么模型复杂度增加时,模型预测的方差会增大,偏差会减小?
  2. RHEL4- WEB服务(十二)用户访问apache服务器认证
  3. outlook 未安装信息服务器,Outlook Web Access 未初始化并且在客户端访问服务器上的应用程序日志中记录了事件 ID 64...
  4. Rating Methodology – Bank Loan / Facility Rating(CRISL)
  5. 多操作系统安装实践小结
  6. android ConcurrentHashMap的使用
  7. 实现带header和footer功能的RecyclerView——完善篇
  8. 值得收藏!动图演示神经架构搜索
  9. 【转】Visual Studio 2005 上 AJAX(AjaxControlToolkit) 的安装
  10. (65)Vue-cli介绍
  11. Django 静态文件处理
  12. mysql update 并发 慢_详解Mysql的锁机制
  13. Joomla网站的移植步骤
  14. pppoe路由桥混合模式_192.168.1.1路由器怎么设置和登陆
  15. 计算机鼠标游戏教学法,浅谈游戏教学法在信息技术教学中的应用论文
  16. uniapp拍照上传照片流程笔记
  17. dom影像图形成数字地形图_DOM卫星影像
  18. 北京思想聚合科技有限公司
  19. 你想知道的NB-IoT知识都在这里了!
  20. 数据库设计3个泛式和经验谈

热门文章

  1. 【数据结构与算法】之深入解析“切割后面积最大的蛋糕”的求解思路与算法示例
  2. android 腾讯微博源码,android掌上微博分享实例(腾讯微博)
  3. Springboot加密配置文件中数据库密码的两种解决方案
  4. GitHub Pages + Hexo + NexT + Typora + WhatsNote打造完美个人知识共享博客
  5. POJ 1141 Brackets Sequence(动态规划)
  6. MySQL中关于insert语句速度的优化
  7. unimrcp的voice activity dector
  8. 南邮计算机学院答辩,南京邮电大学来华留学研究生答辩流程
  9. typescript 类型系统从无知到失智
  10. 自动检测技术学习心得体会_.自动检测技术总结.ppt