群聊服务器的实现=服务端

news/2024/10/22 12:26:17/

第一步 初始化套接字,具体就不写了 ,重复的代码

std::cout << "this is server" << std::endl;
...

第二步   创建互斥锁

hMutex = CreateMutex(NULL, FALSE, NULL);

第三步 创建服务器套接字、绑定、监听,重复的代码

。。。

第四步  与客户端建立连接

    SOCKADDR_IN addrCli;int len = sizeof(SOCKADDR_IN);while (1){SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrCli, &len);

第四步 储存所有客户端

    WaitForSingleObject(hMutex, INFINITE);clieSock[cliecount++] = sockConn;ReleaseMutex(hMutex);

先建立一个互斥锁,因为clieSock我们是设定为全局变量,不过上面代码没有写出来,只要是修改全局变量,就要设定互斥锁

 第五步  既然是一对多,就要创建多线程,而且线程要同步

hthread = (HANDLE)_beginthreadex(NULL,0, &HANDLEclie, (void*)sockConn, 0, NULL);

hthread是我们提前定义的一个句柄

第六步  定义HANDLEclie函数

unsigned WINAPI HANDLEclie(void* arg)
{SOCKET hcliesock = *((SOCKET*)arg);int ilen{};char szMsg[MAX_BUFFSZIE]{};while (1){ilen = recv(hcliesock, szMsg, sizeof(szMsg), 0);if (ilen != -1){/将收到消息转发给客户端sendMsg(szMsg,ilen);}else{   break;   }}

这里recv函数用来接收所有来自客户端的消息,并存储在szMsg中,然后又将SZMSG通过sendMSG函数发送出去

第七步  定义SENDMSG函数

void sendMsg(char* szMsg,int ilen)
{WaitForSingleObject(hMutex, INFINITE);for (int i=0;i< cliecount;i++){send(clieSock[i], szMsg, ilen, 0);}ReleaseMutex(hMutex);
}

这里,定义了一个互斥锁,因为我们之前定义为cliesock[]为全局变量,只是没写出来,然后发送给客户端,这里send第一个参数为目标套接字

第八步  继续完善HANDLEclie

WaitForSingleObject(hMutex, INFINITE);for (int i=0;i<cliecount;i++){if (hcliesock== clieSock[i]){while (i++ < cliecount){clieSock[i] = clieSock[i + 1];}break;}}cliecount--;
ReleaseMutex(hMutex);

如果hcliesock为-1,那么让后面的套接字顶替它,那么hcliesock什么时候为-1呢,那就是main函数中的accept函数,当它连接失败,就会把失败的套接字也写入数组clieSock中,所以只要数组中的socket为失败的socket,就删除它


http://www.ppmy.cn/news/93142.html

相关文章

「SQL面试题库」 No_79 最后一个能进入电梯的人

&#x1f345; 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起&#xff0c;全员免费参与的SQL学习活动。我每天发布1道SQL面试真题&#xff0c;从简单到困难&#xff0c;涵盖所有SQL知识点&#xff0c;我敢保证只要做完这100道题&#xff0c;不仅能轻松搞定面试&#xff0…

【搭建服务器】Win10 IIS搭建webdav服务以及公网访问教程 - 挂载webdav

文章目录 1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表 4. 公网远程访问4.1 浏览器访问测试4.2 映射本地盘符访问4.3 安装Raidrive客户端 总结&#xff1a; 自己用W…

面向Java开发者的ChatGPT提示词工程(1)

各位Java开发者们&#xff0c;欢迎来到万猫学社&#xff01;在这里&#xff0c;我将和大家分享ChatGPT提示词工程的系列文章&#xff0c;希望能够和大家一起学习和探讨提示词的最佳实践。 虽然互联网上已经有很多有关提示词的材料&#xff0c;比如那些“每个人都必须知道的30个…

【入门】拐角III

【入门】拐角III Description 输入整数N&#xff0c;输出相应方阵。 Input 一个整数N。&#xff08; 0 < n < 10 ) Output 一个方阵&#xff0c;每个数字的场宽为3。 Sample Input 1 5 Sample Output 1 5 5 5 5 55 4 4 4 45 4 3 3 35 4 3 2 25 4…

Java on Azure Tooling 4月更新|路线图更新及 Azure Toolkit for IntelliJ 增强

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到 Java on Azure 工具产品的4月更新。让我们首先来谈谈我们对未来几个月的 Java on Azure 开发工具的投资。在这次更新中&#xff0c;我们…

http不同版本之间的区别

前言&#xff1a;http当前有哪些版本 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种用于传输超媒体文档的应用层协议&#xff0c;当前主要使用的版本有 HTTP 1.0、HTTP 1.1 和 HTTP 2。 一、HTTP 1.0 这是最早的版本&#xff0…

JetBrains的Python集成开发环境Pycharm 2023版本在Linux系统的下载与安装配置教程

目录 前言一、PyCharm安装二、使用配置总结 前言 PyCharm是一款专为Python语言开发人员设计的集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地编写、调试和部署Python应用程序。注&#xff1a;已在CentOS7.9和Ubuntu…

rollup打包react组件

这次主要简单实现用rollup打包react组件&#xff0c;组件的话简单写了一个弹窗组件&#xff0c;效果如下&#xff1a; 点击打开弹框&#xff0c;点击关闭按钮关闭弹框 首先创建react项目&#xff0c;这边还是用mfex-project脚手架创建 mfex-project create react-demo 然后编…