C++ select模型简单聊天室
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模型简单聊天室相关推荐
- java web利用mvc结构实现简单聊天室功能
简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是: 1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进 ...
- SpringBoot +WebSocket实现简单聊天室功能实例
SpringBoot +WebSocket实现简单聊天室功能实例) 一.代码来源 二.依赖下载 三.数据库准备(sql) 数据库建表并插入sql 四.resources文件配置 application ...
- python socket 网络聊天室_Python基于Socket实现简单聊天室
本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...
- java web聊天室原理_java web利用mvc结构实现简单聊天室功能
简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是: 1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进行mvc结构的设 ...
- jsp实现简单聊天室
实现简单聊天室.要求以B/S方式实现多人聊天,可以保留聊天者的昵称和聊天内容. 主要由7个jsp页面组成 main.jsp <%@ page language="java" ...
- node.js入门 - 2.创建一个简单聊天室
这篇文章将通过开发一个简单聊天室的方式,介绍node.js的net模块. 一.第一版,只向客户端发送信息 我们先实现一个简单的版本,代码如下: var net=require('net'); va ...
- 利用socket.io+nodejs打造简单聊天室
代码地址如下: http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...
- Asp.Net SignalR - 简单聊天室实现
简单聊天室 使用持久链接类我们就可以做一些即时通讯的应用了,我使用Group做了一个简单的聊天室,先上图技术细节下面再讲 可以加入聊天室.创建聊天室.发送消息,下面就说说我是如何通过Group做出来的 ...
- java jsp聊天系统_java web实现简单聊天室
目标 servlet.jsp实现简单聊天室,用户通过浏览器登录后进入聊天室,可发送消息进行群聊,点击聊天信息框中的用户名可实现拍一拍功能. 基础知识 数据的存取 setAttribute / getA ...
- c聊天室系统asp ajax,利用AJAX和ASP.NET实现简单聊天室
利用AJAX和ASP.NET实现简单聊天室 我的第一个简单的Chatroom是用ASP3.0写成的.那无外乎有二个TextBox,他们发送消息 给程序变量然后显示在一个每秒刷新的页面上.在那个时代,一 ...
最新文章
- PyTorch 笔记(03)— Tensor 数据类型分类(默认数据类型、CPU tensor、GPU tensor、CPU 和 GPU 之间的转换、数据类型之间转换)
- Moses 里的参数(未完成)
- 使用Tomcat Native提升Tomcat IO效率
- 计算机秋招必备!广州互联网大厂企业整理清单!
- 黑马程序员-内部类总结和笔记
- 【ArcGIS遇上Python】ArcGIS Python获取Shapefile矢量数据字段名称
- 小米正式开源 Istio 管理面板 Naftis
- sql 删除重复记录
- HDU 1069 Monkey and Banana 动态规划
- 达梦数据库SQL语句执行
- java spring security详解
- c语言if语句知识点总结,c语言中if语句知识点总结
- CGROUP CFS 调度中的 period,burst 概念
- kuwo.php采集,PHP获取酷我音乐MP3外链
- win10 输入法 删除
- 生态对对碰|云和恩墨数据库云管平台 zCloud 最新支持 TiDB
- DOTA2匹配机制详解
- 功夫熊猫:电子病历评级概述——总论
- Pandas两重山之Series(索引)
- 二叉树递归和非递归遍历