当前位置: 首页 > news >正文

Linux C 基于tcp和epoll在线聊天室

基于tcp和epoll在线聊天室

  • 说明
  • 服务端代码

说明

  服务端:实现了验证用户是否已经存在(支持最大64用户连接)支持广播用户进入退出聊天室以及用户聊天内容。
  这里只提供里服务端代码,如果想要看客户端代码点击这里。

服务端代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <arpa/inet.h>
#include <time.h>
#include <sys/epoll.h>typedef struct sockaddr  SA;
typedef struct sockaddr_in  SIN;
#define MAXBACKLOG   100int Socket(int domain,int type,int protocol);
int Bind(int sockfd,struct sockaddr * my_addr,int addrlen);
int Listen(int s,int backlog);
int Accept(int s,struct sockaddr * addr,int * addrlen);
int is_exist(char * username);
void broadcast(char *r,char *n);char Userlist[64][20] = {0};
int Userfdlist[64] = {0};//./app 192.168.5.166  8888
int main(int argc,char *argv[])
{	int opt = 1;//建立监听套接字int socketfd = Socket(AF_INET,SOCK_STREAM,0);//需要进行重用地址及其端口号setsockopt(socketfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));//绑定信息编写服务器信息SIN   serverinfo;serverinfo.sin_family =AF_INET;serverinfo.sin_port   =htons(atoi(argv[2])); serverinfo.sin_addr.s_addr=  inet_addr(argv[1]);int addrlen = sizeof(SIN);Bind(socketfd,(SA*)&serverinfo,addrlen);//监听Listen(socketfd,MAXBACKLOG);//epoll创建根节点int epollfd = epoll_create(1024);//添加socketfd文件描述符至内核 红黑树struct epoll_event event;event.events = EPOLLIN;			//事件成员event.data.fd = socketfd;		//数据epoll_ctl(epollfd,EPOLL_CTL_ADD,socketfd, &event);//读写while(1){struct epoll_event events[10];int count = epoll_wait(epollfd,events,10,-1);for(int i = 0; i< count;i++){if(events[i].events == EPOLLIN){if(events[i].data.fd == socketfd){//wait client connectSIN clientinfo;struct epoll_event event;int  clientaddrlen =sizeof(SA);int newfd = Accept(socketfd,(SA*)&clientinfo,&clientaddrlen);printf("客户端地址:%s 端口号:%d\n",inet_ntoa(clientinfo.sin_addr),ntohs(clientinfo.sin_port));//read usernamechar namebuff[20];read(newfd,namebuff,sizeof(namebuff));if(is_exist(namebuff)){write(newfd,"已存在",sizeof("已存在"));close(newfd);}else{//put newfd into Red-Black Treeevent.events = EPOLLIN;			//事件成员event.data.fd = newfd;			//数据epoll_ctl(epollfd,EPOLL_CTL_ADD,newfd, &event);write(newfd,"登录成功",sizeof("登录成功"));	//save userfd & usernamefor(int j=0;j<64;j++)if(strlen(Userlist[j])==0){Userfdlist[j]=event.data.fd;strcpy(Userlist[j],namebuff);break;}	char r[50];sprintf(r,"%s %s",namebuff,"进入聊天室");printf("%s\n",r);broadcast(r,namebuff);}}else{//readchar readbuff[512] = {0};int len = read(events[i].data.fd,readbuff,sizeof(readbuff));//get name and poschar namebuff[20] = {0};int key = 0;for(int i=0;i<10;i++)if(strstr(readbuff,Userlist[i])){strcpy(namebuff,Userlist[i]);key=i;break;}if(len > 0 && strlen(readbuff)!=0){printf("%s\n",readbuff);broadcast(readbuff,namebuff);if(strstr(readbuff,"退出")){strcpy(Userlist[key],"\0");Userfdlist[key] = 0;epoll_ctl(epollfd,EPOLL_CTL_DEL,events[i].data.fd,NULL);close(events[i].data.fd);}}else if(len <= 0){epoll_ctl(epollfd,EPOLL_CTL_DEL,events[i].data.fd,NULL);close(events[i].data.fd);}}}}}//关闭close(socketfd);return 0;
}
int is_exist(char * username)
{for(int i = 0 ; i < 10; i++)if(strcmp(username,Userlist[i]) == 0)return 1;return 0;
}
void broadcast(char *r,char *n)
{for(int i=0 ; i<64 ;i++)//if it is a user and not himselfif(strcmp(Userlist[i],n)!=0 && strlen(Userlist[i])!=0)write(Userfdlist[i],r,strlen(r));
}
int Socket(int domain,int type,int protocol)
{int socketFd = socket(domain,type,protocol);if(socketFd == -1){perror("socket");exit(1);}return socketFd;
}
int Bind(int sockfd,struct sockaddr * my_addr,int addrlen)
{int val = bind(sockfd,my_addr,addrlen);if(val){perror("bind");exit(1);}return 0;
}
int Listen(int s,int backlog)
{int val = listen(s,backlog);if(val == -1){perror("listen");exit(1);}return val;
}
int Accept(int s,struct sockaddr * addr,int * addrlen)
{int NEWfd = accept(s,addr,addrlen);if(NEWfd == -1){perror("listen");exit(1);}return NEWfd;
}

相关文章:

Linux C 基于tcp和epoll在线聊天室

基于tcp和epoll在线聊天室 说明服务端代码 说明 服务端&#xff1a;实现了验证用户是否已经存在&#xff08;支持最大64用户连接&#xff09;支持广播用户进入退出聊天室以及用户聊天内容。   这里只提供里服务端代码&#xff0c;如果想要看客户端代码点击这里。 服务端代码…...

为什么要隐藏id地址?使用IP代理技术可以实现吗?

随着网络技术的不断发展&#xff0c;越来越多的人开始意识到保护个人隐私的重要性。其中&#xff0c;隐藏自己的IP地址已经成为了一种常见的保护措施。那么&#xff0c;为什么要隐藏IP地址&#xff1f;使用IP代理技术可以实现吗&#xff1f;下面就一起来探讨这些问题。 首先&am…...

前端(HTML + CSS + JS)

文章目录 一、HTML1. 概念&#xff08;1&#xff09;HTML 文件基本结构&#xff08;2&#xff09;HTML代码框架 2. 、HTML常见标签 二、CSS1. CSS基本语法规范2. 用法&#xff08;1&#xff09; 引用方式&#xff08;2&#xff09;选择器&#xff08;3&#xff09;常用元素属性…...

12 要素 12 Factor

I. 基准代码 一份基准代码&#xff0c;多份部署 一个应用&#xff0c;一个基准代码git仓库&#xff0c;多个环境版本部署&#xff08;prod&#xff0c;staging&#xff0c;develop&#xff09; II. 依赖 显式声明依赖关系 docker的dockerfile&#xff0c;php的composer.jso…...

十大排序之冒泡排序与快速排序(详解)

文章目录 &#x1f412;个人主页&#x1f3c5;算法思维框架&#x1f4d6;前言&#xff1a; &#x1f380;冒泡排序 时间复杂度O(n^2)&#x1f387;1. 算法步骤思想&#x1f387;2.动画实现&#x1f387; 3.代码实现&#x1f387;4.代码优化&#xff08;添加标志量&#xff09; …...

【SpringBoot篇】阿里云OSS—存储文件的利器

文章目录 &#x1f339;什么是阿里云OSS⭐阿里云OSS的优点 &#x1f3f3;️‍&#x1f308;为什么要使用云服务OSS&#x1f384;使用步骤⭐OSS开通⭐参考官方SDK &#x1f354;编写代码⭐上传文件 &#x1f339;综合案例 &#x1f339;什么是阿里云OSS 阿里云对象存储&#xf…...

Leetcode—58.最后一个单词的长度【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—58.最后一个单词的长度 实现代码 int lengthOfLastWord(char* s) {int len strlen(s);int left 0, right 0;if(len 1) {return 1;}while(right < len) {if(right 1 < len) {if(s[right] && s[righ…...

Apach Ozone部署

前言 最近由于工作需要&#xff0c;要部署一套ozone。我自己对hadoop这套体系不是很熟悉&#xff0c;所以过程磕磕碰碰&#xff0c;好不容易勉强搭起来&#xff0c;所以记录一下部署方式 准备 三台主机&#xff0c;主机均已安装jdk、hdfs&#xff0c;相关的安装配置就不另外写…...

【nlp】3.2 Transformer论文复现:1. 输入部分(文本嵌入层和位置编码器)

Transformer论文复现:输入部分(文本嵌入层和位置编码器) 1 输入复现1.1 文本嵌入层1.1.1 文本嵌入层的作用1.1.2 文本嵌入层的代码实现1.1.3 文本嵌入层中的注意事项1.2 位置编码器1.2.1 位置编码器的作用1.2.2 位置编码器的代码实现1.2.3 位置编码器中的注意事项1 输入复现…...

自动化部署 / 扩容openGauss —— Ansible for openGauss

前言 大家好&#xff0c;今天我们为大家推荐一套基于 Ansible 开发的&#xff0c;自动化部署及扩容 openGauss 的脚本工具&#xff1a;Ansible for openGauss&#xff08;以下简称 AFO&#xff09;。 通过AFO&#xff0c;我们只需简单修改一些配置文件&#xff0c;即可快速部署…...

Go 实现网络代理

使用 Go 语言开发网络代理服务可以通过以下步骤完成。这里&#xff0c;我们将使用 golang.org/x/net/proxy 包来创建一个简单的 SOCKS5 代理服务作为示例。 步骤 1. 安装 golang.org/x/net/proxy 包 使用以下命令安装 golang.org/x/net 包&#xff0c;该包包含 proxy 子包&am…...

Redis报错:JedisConnectionException: Could not get a resource from the pool

1、问题描述&#xff1a; redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 2、简要分析&#xff1a; redis.clients.util.Pool.getResource会从JedisPool实例池中返回一个可用的redis连接。分析源码可知JedisPool 继承了 r…...

【广州华锐互动】Web3D云展编辑器能为展览行业带来哪些便利?

在数字时代中&#xff0c;传统的展览方式正在被全新的技术和工具所颠覆。其中&#xff0c;最具有革新意义的就是Web3D云展编辑器。这种编辑器以其强大的功能和灵活的应用&#xff0c;正在为展览设计带来革命性的变化。 广州华锐互动开发的Web3D云展编辑器是一种专门用于创建、编…...

Vue项目实战之一----实现分类弹框效果

效果图 实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"js/vue.js"></script><!-- 引入样式 --><link rel"stylesheet&qu…...

Vue解析器

解析器本质上是一个状态机。但我们也曾提到&#xff0c;正则表达式其实也是一个状态机。因此在编写 parser 的时候&#xff0c;利用正则表达式能够让我们少写不少代码。本章我们将更多地利用正则表达式来实现 HTML 解析器。另外&#xff0c;一个完善的 HTML 解析器远比想象的要…...

Spring Cloud 版本升级遇坑记:OpenFeignClient与Gateway的恩怨情仇

Spring Cloud 版本升级遇坑记&#xff1a;OpenFeignClient与Gateway的恩怨情仇 近日&#xff0c;在对项目中的 Spring Boot、Spring Cloud 以及 Spring Cloud Alibaba 进行版本升级时&#xff0c;遭遇了一个令人头疼的问题&#xff1a;Spring Cloud Gateway 在运行时一直卡住&a…...

面试:Docker相关问题

文章目录 请解释一下什么是 Docker&#xff0c;以及它在云环境中的应用请简述Docker和LXC的区别什么是Docker Compose&#xff1f;请简述其作用和使用场景在使用Docker时&#xff0c;如何为容器创建一个可访问的网络当一个Docker容器运行异常时&#xff0c;如何通过Docker命令查…...

移动端浏览器 jquery 获取 pdf blob文件流 预览pdf

最近遇到一个需求&#xff0c;一个古早的移动端 juery 项目要求做一个页面&#xff0c;从接口获取 pdf 文件流&#xff0c;然后预览出来 这里使用第三方工具&#xff1a;pdf.js 代码如下&#xff1a; // 引入相关文件<script src"../js/pdf.js" type"text…...

Redis并发问题解决方案

目录 前言 1.分布式锁 1.基于单个节点 2.基于多个节点 3.watch(乐观锁) 2.原子操作 1.单命令操作 2.Lua 脚本(多命令操作) 3.事务 1.执行步骤 2.错误处理 3.崩溃处理 总结 前言 在多个客户端并发访问Redis的时候&#xff0c;虽然Redis是单线程执行指令&#xff…...

读取两个文件夹里不同名的文件,处理映射不对应的文件

解决方案&#xff1a;读取两个文件夹里不同名的文件&#xff0c;处理映射不对应的文件 # -*- coding: utf-8 -*- import ospath1 r/home/ubuntu/data/yoloData/images/train2017 path2 r/home/ubuntu/data/yoloData/labels/train2017def read_all_file_name():file_path ./t…...

Windows 11终极优化指南:使用Win11Debloat脚本免费提升系统性能40%

Windows 11终极优化指南&#xff1a;使用Win11Debloat脚本免费提升系统性能40% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to decl…...

STL文件缩略图生成器:让3D模型文件一目了然

STL文件缩略图生成器&#xff1a;让3D模型文件一目了然 【免费下载链接】stl-thumb Thumbnail generator for STL files 项目地址: https://gitcode.com/gh_mirrors/st/stl-thumb stl-thumb是一款专为STL文件设计的快速轻量级缩略图生成工具&#xff0c;能够在Linux和Wi…...

Vue 3 中集成 Three.js 场景的完整实现指南

本文详细讲解如何在 vue 3&#xff08;javascript 版本&#xff09;项目中正确集成 three.js&#xff0c;完成基础 3d 场景渲染&#xff0c;涵盖 dom 挂载时机、渲染循环管理、响应式容器适配等关键实践。 本文详细讲解如何在 vue 3&#xff08;javascript 版本&#xff0…...

企业信用查询怎么查?避坑指南+实操步骤

企业信用查询怎么查&#xff1f;最直接的方式是通过官方渠道或第三方平台&#xff0c;但很多人不知道&#xff0c;错误的查询方法可能会遗漏关键风险。根据2026年行业数据&#xff0c;68%的用户因信息分散导致风险识别不全。那么&#xff0c;如何高效、全面地查询企业信用呢&am…...

DS4Windows终极指南:3步让PlayStation手柄在Windows上完美运行

DS4Windows终极指南&#xff1a;3步让PlayStation手柄在Windows上完美运行 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 还在为PC游戏无法识别你的PlayStation手柄而烦恼吗&#xff1f;…...

PostgreSQL 完整案例:重构遗留代码,搭建现代化工程架构

一、前言PostgreSQL 完整案例&#xff1a;重构遗留代码&#xff0c;搭建现代化工程架构是后端工程师必须掌握的核心技能。本文从PostgreSQL出发&#xff0c;覆盖开发中最实用的知识点&#xff0c;配有完整可运行的 SQL/代码示例。二、索引设计与优化2.1 索引类型选择-- 基础索引…...

手把手教你用网线给imx6ull开发板共享网络(Windows 10/11保姆级教程)

从零搭建imx6ull开发板网络环境&#xff1a;Windows有线共享全攻略 刚拿到imx6ull开发板时&#xff0c;最让人头疼的问题莫过于网络连接。实验室没有现成的路由器&#xff1f;宿舍WiFi信号不稳定&#xff1f;别担心&#xff0c;一根网线就能解决所有问题。本文将带你用最经济的…...

别再手动填表了!用Java+poi-tl 1.10.0自动生成Word报表(附动态表格完整代码)

解放双手&#xff1a;Javapoi-tl实现智能Word报表生成实战 每次看到同事在Word和Excel之间来回切换复制数据&#xff0c;我都忍不住想推荐这个自动化方案。上周财务部的小张告诉我&#xff0c;她花了两天时间整理季度报表&#xff0c;最后因为粘贴错位导致数据全部重做。这种重…...

用Python从零实现地震波合成:手把手教你用NumPy和Matplotlib搞定褶积模型

用Python从零实现地震波合成&#xff1a;手把手教你用NumPy和Matplotlib搞定褶积模型 地震勘探是地球物理研究的重要手段&#xff0c;而合成地震记录则是理解地震波传播特性的关键工具。本文将带你用Python从头构建一个完整的地震波合成系统&#xff0c;通过代码实现反射系数计…...

小猫爪:FreeRTOS浮点运算的隐形陷阱——configUSE_TASK_FPU_SUPPORT配置详解

1. 浮点运算的隐形陷阱&#xff1a;为什么你的FreeRTOS计算结果会出错 第一次在FreeRTOS环境下遇到浮点运算错误时&#xff0c;我盯着屏幕上那些明显不合理的计算结果&#xff0c;一度怀疑是不是自己熬夜太久产生了幻觉。特别是在使用Cortex-R5这类带FPU的处理器时&#xff0c;…...