C++ select模型简单聊天室

TIPS:以下使用CMake项目进行开发。关于何为CMake,链接:https://blog.csdn.net/qq135595696/article/details/124052273

简单聊天室效果展示

简单聊天室服务端源码(使用select模型)

// Server0327.cpp: 定义应用程序的入口点。
//#include "Server0327.h"
#include <WinSock2.h>
#include <vector>#pragma comment(lib,"ws2_32.lib")using namespace std;
class TcpServer
{public:bool Listen(const char* ip, int port){//创建socket_serverSock = socket(AF_INET, SOCK_STREAM, 0);if (INVALID_SOCKET == _serverSock)goto Exit;//绑定IP和端口号SOCKADDR_IN addr;addr.sin_addr.s_addr = inet_addr(ip);addr.sin_family = AF_INET;addr.sin_port = htons(port);if (INVALID_SOCKET == bind(_serverSock, (sockaddr*)&addr, sizeof(SOCKADDR_IN)))goto Exit;//监听端口if (INVALID_SOCKET == listen(_serverSock, 255))goto Exit;return true;Exit:closesocket(_serverSock);_serverSock = INVALID_SOCKET;return false;}void Update(){FD_SET reads;FD_ZERO(&reads);FD_SET(_serverSock, &reads);for (auto&& clientSock : _clientSocks)FD_SET(clientSock, &reads);int nRet = select(0, &reads, nullptr, nullptr, nullptr);if (nRet > 0){if (FD_ISSET(_serverSock, &reads))Accept();else{for (int i = 0; i < _clientSocks.size(); i++){if (FD_ISSET(_clientSocks[i], &reads)){char buf[1024]{ 0 };int nRecv = recv(_clientSocks[i], buf, 1024, 0);if (nRecv > 0)OnNetMsg(_clientSocks[i], buf, sizeof(buf));if (nRecv <= 0){closesocket(_clientSocks[i]);OnDisConnect(_clientSocks[i]);_clientSocks.erase(_clientSocks.begin() + i);continue;}}}}}}void Accept(){SOCKADDR_IN clientAddr;int clientAddrLen = sizeof(clientAddr);SOCKET clientSock = accept(_serverSock, (sockaddr*)&clientAddr, &clientAddrLen);if (INVALID_SOCKET != clientSock){_clientSocks.push_back(clientSock);OnConnect(clientSock);}}void OnConnect(SOCKET clientSock){printf("%d 客户端连接\n", clientSock);}int OnNetMsg(SOCKET clientSock, const char* buff, int len){printf("%d == %s\n", clientSock, buff);for (auto&& clientSock : _clientSocks)send(clientSock, buff, len, 0);return len;}void OnDisConnect(SOCKET sock){printf("%d==客户端断开连接\n", sock);}private:SOCKET _serverSock;vector<SOCKET> _clientSocks;
};int main()
{WSADATA wsa;WSAStartup(MAKEWORD(2, 2), &wsa);TcpServer server;server.Listen("0.0.0.0", 7890);while (true)server.Update();WSACleanup();return 0;
}

简单聊天室客户端源码(使用多线程)

// CMakeClient0331.cpp: 定义应用程序的入口点。
//#include "CMakeClient0331.h"
#include<iostream>
#include<WinSock2.h>
#include<thread>#pragma comment(lib,"ws2_32.lib")int main()
{WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET clientSock = socket(AF_INET, SOCK_STREAM, 0);if (INVALID_SOCKET == clientSock){closesocket(clientSock);WSACleanup();return 0;}SOCKADDR_IN serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");serverAddr.sin_port = htons(7890);if (INVALID_SOCKET == connect(clientSock, (sockaddr*)&serverAddr, sizeof(SOCKADDR_IN))){closesocket(clientSock);WSACleanup();return 0;}std::cout << "已连接服务端" << std::endl;std::thread t([&clientSock] {while (true){char buf[1024]{ 0 };int nRecvLen = recv(clientSock, buf, 1024, 0);if (nRecvLen <= 0)break;std::cout << "接收数据长度:" << nRecvLen << " 接受数据:" << buf << std::endl;}});t.detach();while (true){char buf[1024]{ 0 };std::cin >> buf;if (buf[0] == 'q')break;int nSendLen = send(clientSock, buf, sizeof(buf), 0);}closesocket(clientSock);WSACleanup();return 0;
}

C++ select模型简单聊天室相关推荐

  1. java web利用mvc结构实现简单聊天室功能

    简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是:         1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进 ...

  2. SpringBoot +WebSocket实现简单聊天室功能实例

    SpringBoot +WebSocket实现简单聊天室功能实例) 一.代码来源 二.依赖下载 三.数据库准备(sql) 数据库建表并插入sql 四.resources文件配置 application ...

  3. python socket 网络聊天室_Python基于Socket实现简单聊天室

    本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...

  4. java web聊天室原理_java web利用mvc结构实现简单聊天室功能

    简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是: 1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进行mvc结构的设 ...

  5. jsp实现简单聊天室

    实现简单聊天室.要求以B/S方式实现多人聊天,可以保留聊天者的昵称和聊天内容. 主要由7个jsp页面组成 main.jsp <%@ page language="java" ...

  6. node.js入门 - 2.创建一个简单聊天室

    这篇文章将通过开发一个简单聊天室的方式,介绍node.js的net模块. 一.第一版,只向客户端发送信息   我们先实现一个简单的版本,代码如下: var net=require('net'); va ...

  7. 利用socket.io+nodejs打造简单聊天室

    代码地址如下: http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

  8. Asp.Net SignalR - 简单聊天室实现

    简单聊天室 使用持久链接类我们就可以做一些即时通讯的应用了,我使用Group做了一个简单的聊天室,先上图技术细节下面再讲 可以加入聊天室.创建聊天室.发送消息,下面就说说我是如何通过Group做出来的 ...

  9. java jsp聊天系统_java web实现简单聊天室

    目标 servlet.jsp实现简单聊天室,用户通过浏览器登录后进入聊天室,可发送消息进行群聊,点击聊天信息框中的用户名可实现拍一拍功能. 基础知识 数据的存取 setAttribute / getA ...

  10. c聊天室系统asp ajax,利用AJAX和ASP.NET实现简单聊天室

    利用AJAX和ASP.NET实现简单聊天室 我的第一个简单的Chatroom是用ASP3.0写成的.那无外乎有二个TextBox,他们发送消息 给程序变量然后显示在一个每秒刷新的页面上.在那个时代,一 ...

最新文章

  1. PyTorch 笔记(03)— Tensor 数据类型分类(默认数据类型、CPU tensor、GPU tensor、CPU 和 GPU 之间的转换、数据类型之间转换)
  2. Moses 里的参数(未完成)
  3. 使用Tomcat Native提升Tomcat IO效率
  4. 计算机秋招必备!广州互联网大厂企业整理清单!
  5. 黑马程序员-内部类总结和笔记
  6. 【ArcGIS遇上Python】ArcGIS Python获取Shapefile矢量数据字段名称
  7. 小米正式开源 Istio 管理面板 Naftis
  8. sql 删除重复记录
  9. HDU 1069 Monkey and Banana 动态规划
  10. 达梦数据库SQL语句执行
  11. java spring security详解
  12. c语言if语句知识点总结,c语言中if语句知识点总结
  13. CGROUP CFS 调度中的 period,burst 概念
  14. kuwo.php采集,PHP获取酷我音乐MP3外链
  15. win10 输入法 删除
  16. 生态对对碰|云和恩墨数据库云管平台 zCloud 最新支持 TiDB
  17. DOTA2匹配机制详解
  18. 功夫熊猫:电子病历评级概述——总论
  19. Pandas两重山之Series(索引)
  20. 二叉树递归和非递归遍历

热门文章

  1. mysql基础1-数据库安装配置及语句规范
  2. python查看大文件的最后一行
  3. 揭秘React同构应用
  4. 软件开发的变化并不大
  5. 8.14 few-shot learning——幻想数据
  6. freopen()函数文件流重定向和文件流的清除
  7. html圆圈复选框的代码,单选、复选框Demo
  8. js base64图片太大_JS实现base64图片下载 简易方法
  9. 显卡算力排行2020_AMD正式发布RX6000系列显卡
  10. python调用go并把结果传回go_从Go调用Python函数并获取函数返回值