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

C语言多人聊天室 ---chat(客户端聊天)

head.h

#ifndef __HEAD_H
#define __HEAD_H// 常用头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 网络编程涉及的头文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>#include <sys/types.h>// 本机字节序和网络字节序转换相关函数的头文件
#include <arpa/inet.h>// 关闭套接字用close函数需要的头文件
#include <unistd.h>//线程相关的函数头, mutex相关的函数
#include <pthread.h>// 类型重命名:地址结构体的规范
typedef struct sockaddr SockAddr;// 地址结构体的规范的实现结构体
typedef struct sockaddr_in SockAddrIn;// if_nametoindex
#include <net/if.h>#include <sys/select.h>
#include <sys/time.h>// JSON字符串的封装
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 文件操作需要的头文件
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>#include <fcntl.h>
#include <mysql/mysql.h>// selet
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>// 定义外部变量
//int sockfdNUM[10] = {0};#endif

p_char.h

#ifndef _P_CHAT_H
#define _P_CHAT_H#define BUF_SIZE 1024#include "head.h"// 错误处理函数,用于输出错误信息并终止程序
void error_handling(const char *message);#endif

p_chat.c

#include "p_chat.h"// 私聊接收任务函数
void *s_private_chat(void *arg)
{// 1.获取客户端套接字int sock = *(int *)arg;char buf[1024] = {0};while (1){scanf("%s", buf);send(sock, buf, strlen(buf), 0);if (strcmp(buf, "quit") == 0){break;}memset(buf, 0, sizeof(buf));}// 关闭服务端套接字close(sock);exit(0); // 结束整个线程
}void *r_private_chat(void *arg)
{// 1.获取客户端套接字int sock = *(int *)arg;char buf[1024] = {0};while (1){recv(sock, buf, sizeof(buf), 0);printf("%s\n", buf);memset(buf, 0, sizeof(buf));}// 关闭服务端套接字close(sock);
}// 客户端
int main(int argc, char const *argv[])
{// 创建线程idpthread_t tid1;pthread_t tid2;// 1.创建socketint s_sockfd = socket(AF_INET, SOCK_STREAM, 0);if (-1 == s_sockfd){perror("socket failed");return -1;}// 2.绑定地址SockAddrIn serverAddr;// ipv4协议serverAddr.sin_family = AF_INET;// 端口serverAddr.sin_port = htons(8888);// ip地址serverAddr.sin_addr.s_addr = inet_addr("192.168.118.129");// 创建一个用于存放的json字符的数组char *jsonString;// 3.连接服务器int ret = connect(s_sockfd, (SockAddr *)&serverAddr, sizeof(serverAddr));if (-1 == ret){perror("connect failed");return -1;}// 4.1 接收服务器消息char buf[2048] = {0};ret = recv(s_sockfd, buf, sizeof(buf), 0);if (-1 == ret){perror("recv failed");return -1;}int uid, fid;uid = atoi(argv[1]);fid = atoi(argv[2]);printf("uid = %d\n", uid);printf("fid = %d\n", fid);printf("s_sockfd = %d\n", s_sockfd);// 判断上一个进程传来的数据if (strcmp(argv[3], "私聊") == 0){// 向服务端发送自己的状态int stat = 1;send(s_sockfd, &stat, sizeof(stat), 0);// 私聊// 发送uidsend(s_sockfd, &uid, sizeof(uid), 0);// 发送fidsend(s_sockfd, &fid, sizeof(fid), 0);//puts("待接收历史消息");// 清空bufmemset(buf, 0, sizeof(buf));// 接收聊天记录recv(s_sockfd, buf, sizeof(buf), 0);//puts("历史消息接收完毕:");puts(buf);puts("以上是历史消息");// 创建线程pthread_create(&tid1, NULL, s_private_chat, &s_sockfd);pthread_create(&tid2, NULL, r_private_chat, &s_sockfd);// 等待线程结束pthread_join(tid1, NULL);}else if (strcmp(argv[3], "群聊") == 0){// 向服务端发送自己的状态int stat = 2;send(s_sockfd, &stat, sizeof(stat), 0);// 公屏聊天// 发送uidsend(s_sockfd, &uid, sizeof(uid), 0);puts("开始聊天");// 创建线程pthread_create(&tid1, NULL, s_private_chat, &s_sockfd);pthread_create(&tid2, NULL, r_private_chat, &s_sockfd);// 等待线程结束pthread_join(tid1, NULL);}// 5.关闭socketclose(s_sockfd);puts("关闭socket");return 0;
}

makefile

SRCS = $(wildcard *.c)
OBJS = $(patsubst *.c,*.o,$(SRCS))
CC = gcc
TARGET = p_chat
LDFLAGS = -lpthread -lmysqlclient.PHONY : clean$(TARGET) : $(OBJS)$(CC)  $^ -o $@ $(LDFLAGS)clean :rm *.orun :./$(TARGET)show :echo $(SRCS) / $(OBJS)

相关文章:

C语言多人聊天室 ---chat(客户端聊天)

head.h #ifndef __HEAD_H #define __HEAD_H// 常用头文件 #include <stdio.h> #include <stdlib.h> #include <string.h>// 网络编程涉及的头文件 #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h>#include <…...

联想 SR590 服务器 530-8i RAID 控制器更换损坏的硬盘

坏了的硬盘会自动亮黄灯。用一个空的新盘来替换&#xff0c;新盘最好不要有东西。但是有东西可能也没啥&#xff0c;因为我看 RAID 控制器里有格式化的选项 1. 从 IPMI 把服务器关机&#xff0c;电源键进入绿色闪烁状态 2. 断电&#xff0c;推开塑料滑块拉出支架&#xff0c;…...

城电科技|会追日的智能花,光伏太阳花开启绿色能源新篇章

当艺术与科技相遇&#xff0c;会碰撞出怎样的火花&#xff1f;城电科技推出的光伏太阳花&#xff0c;以其独特的设计与智能化的功能&#xff0c;给出了答案。这款产品不仅具备太阳能发电的实用功能&#xff0c;更是一件充满科技属性的艺术性光伏产品&#xff0c;吸引了广泛关注…...

基于YOLO11深度学习的苹果叶片病害检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

FFmpeg 命令行全解析:高效音视频处理从入门到精通

FFmpeg FFmpeg 是一款开源的多媒体处理工具集,支持音视频编解码、格式转换、流媒体处理等全链路操作。核心功能与工具: 多媒体全链路支持 支持 1000+ 音视频编解码格式(如 H.264、HEVC、AV1)和协议(RTMP、RTSP、HLS),覆盖录制、转码、流化等全流程。提供三大核心工具: …...

kafka数据拉取和发送

文章目录 一、原生 KafkaConsumer1、pom文件引入kafka2、拉取数据3、发送数据二、在spring boot中使用@KafkaListener1、添加依赖2、application.yml3、消息拉取:consumer4、自定义ListenerContainerFactory5、消息发送:producer6、kafka通过clientId鉴权时的鉴权失败问题一、…...

多智能体框架

多个不同的角色的Agent&#xff0c;共同完成一份复杂的工作。由一个统筹管理的智能体&#xff0c;自主规划多个智能体分别做什么&#xff0c;以及执行的顺序。 agent 应该包含的属性 执行特定任务 根据其角色和目标做出决策 能够使用工具来实现目标 与其他代理沟通和协作 保留…...

C++ 正则表达式分组捕获入门指南

在 C 中&#xff0c;正则表达式&#xff08;regex&#xff09;是一种用于匹配字符串模式的强大工具。正则表达式不仅能帮助你查找符合特定模式的字符&#xff0c;还能捕获匹配的子字符串&#xff08;即分组捕获&#xff09;。这篇文章将介绍 C 正则表达式中的分组捕获机制&…...

C#中级教程(1)——解锁 C# 编程的调试与错误处理秘籍

一、认识错误&#xff1a;编程路上的 “绊脚石” 在 C# 编程中&#xff0c;错误大致可分为两类&#xff1a;语法错误和语义错误&#xff08;逻辑错误&#xff09;。语法错误就像是写作文时的错别字和病句&#xff0c;编译器一眼就能识别出来&#xff0c;比如变量名拼写错误、符…...

Jmeter接口并发测试

Apache JMeter 是一款开源的性能测试工具&#xff0c;广泛用于接口并发测试、负载测试和压力测试。以下是使用 JMeter 进行接口并发测试的详细步骤&#xff1a; 一、准备工作 安装 JMeter 下载地址&#xff1a;Apache JMeter 官网 确保已安装 Java 环境&#xff08;JMeter 依…...

MySQL-增删改查

一、Create(创建) &#x1f4d6; 语法&#xff1a; INSERT INTO table_name(value_list); 当我们使用表的时候&#xff0c;就可以使用这个语法来向表中插入元素~ 我们这边创建一个用于示范的表(Student)~ create table student( id int, name varchar(20), chinese int, math…...

开源堡垒机 JumpServer 社区版实战教程:发布机的配置与Website资产配置使用

文章目录 开源堡垒机 JumpServer 社区版实战教程&#xff1a;发布机的配置与Website资产配置使用一、功能简述二、应用发布机2.1 版本要求2.2 创建应用发布机2.2.1 通过WinRM的协议进行应用发布机的创建2.2.2 通过OpenSSH的协议进行应用发布机的创建2.2.2.1 下载OpenSSH2.2.2.2…...

【STM32】使用电打火器测试火焰传感器,去掉传感器LED依然亮

项目需求&#xff1a;火焰传感器识别到火焰后&#xff0c;LED灯闪烁&#xff0c;然后熄灭。 现象描述&#xff1a;不需要火焰传感器&#xff0c;当使用电打火器时电路板LED灯也会闪烁。&#xff08;详情看底部视频&#xff09; fire.h #ifndef __FIRE_H #define __FIRE_H …...

代码随想录算法训练day64---图论系列8《拓扑排序dijkstra(朴素版)》

代码随想录算法训练 —day64 文章目录 代码随想录算法训练前言一、53. 117. 软件构建—拓扑排序二、47. 参加科学大会---dijkstra&#xff08;朴素版&#xff09;总结 前言 今天是算法营的第64天&#xff0c;希望自己能够坚持下来&#xff01; 今天继续图论part&#xff01;今…...

机器学习数学基础:32.斯皮尔曼等级相关

斯皮尔曼等级相关教程 一、定义与原理 斯皮尔曼等级相关系数&#xff08;Spearman’s rank - correlation coefficient&#xff09;&#xff0c;常用 ρ \rho ρ表示&#xff0c;是一种非参数统计量&#xff0c;用于衡量两个变量的等级之间的关联程度。它基于变量的秩次&…...

《论区块链技术及应用》审题技巧 - 系统架构设计师

区块链技术及应用论题写作框架 一、考点概述 本论题“区块链技术及应用”主要考察软件测试工程师对区块链技术的理解及其在软件项目中的实际应用能力。论题涵盖了多个关键方面&#xff0c;首先要求考生对区块链技术有全面的认识&#xff0c;包括但不限于其作为分布式记账技术…...

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷&#xff08;四&#xff09; 第一部分&#xff1a;网络平台搭建与设备安全防护任务书第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响应&…...

单片机的串口(USART)

Tx - 数据的发送引脚&#xff0c;Rx - 数据的接受引脚。 串口的数据帧格式 空闲状态高电平&#xff0c;起始位低电平&#xff0c;数据位有8位校验位&#xff0c;9位校验位&#xff0c;停止位是高电平保持一位或者半位&#xff0c;又或者两位的状态。 8位无校验位传输一个字节…...

Modelfile配置说明

参数说明翻译 参数描述值类型示例用法mirostat启用Mirostat采样以控制困惑度。&#xff08;默认&#xff1a;0&#xff0c;0禁用&#xff0c;1Mirostat&#xff0c;2Mirostat 2.0&#xff09;intmirostat 0mirostat_eta影响算法对生成文本反馈的响应速度。较低的学习率将导致调…...

pnpm的基本用法

以下是 pnpm 的核心命令和使用指南&#xff0c;涵盖从安装依赖到项目管理的常见操作&#xff1a; 1. 基础命令 (1) 安装依赖 pnpm install # 安装 package.json 中的所有依赖 pnpm install <包名> # 安装指定包&#xff08;自动添加到 dependencies&#xf…...

动态规划(背包问题)--是否逆序使用的问题--二进制拆分的问题

动态规划&#xff08;背包问题&#xff09; 题目链接01背包代码 完全背包问题代码 多重背包问题 I代码 什么时候适用逆序多重背包问题 II&#xff08;超百万级的复杂度&#xff09;代码 关于二进制拆分 题目链接 01背包 代码 #include <iostream> #include <vector&…...

Vue 中动态实现进度条

在 Vue 中动态实现进度条&#xff0c;基本上有两种常见的方法&#xff1a;直接通过 Vue 数据绑定控制样式&#xff0c;或者利用外部库来实现更复杂的功能。我们会深入探讨这两种方式&#xff0c;并且详细说明每种方法的实现步骤、优缺点以及使用场景。 1. 使用 Vue 数据绑定来…...

如何基于PyTorch做二次开发

基于PyTorch进行二次开发以实现可视化工程&#xff0c;可以从以下几个方面入手&#xff1a;模型结构可视化、训练过程监控、特征可视化等。以下是一些推荐的GitHub项目&#xff0c;这些项目可以帮助你快速搭建一个可视化的工程环境&#xff1a; ### 1. **PyTorch CNN Visualiz…...

Mac 版 本地部署deepseek ➕ RAGflow 知识库搭建流程分享(附问题解决方法)

安装&#xff1a; 1、首先按照此视频的流程一步一步进行安装&#xff1a;(macos版&#xff09;ragflowdeepseek 私域知识库搭建流程分享_哔哩哔哩_bilibili 2、RAGflow 官网文档指南&#xff1a;https://ragflow.io 3、RAGflow 下载地址&#xff1a;https://github.com/infi…...

算法——后缀平衡树

先回想一下之前讨论的内容。之前我们详细讨论了后缀树&#xff0c;包括它的构建、应用以及相关算法。用户可能是在了解后缀树之后&#xff0c;想要进一步探索相关的数据结构&#xff0c;或者是想比较后缀树和后缀平衡树的异同。 后缀平衡树并不是一个常见的数据结构名称&#…...

姿态矩阵/旋转矩阵/反对称阵

物理意义&#xff0c;端点矢量角速率叉乘本身向量&#xff1b; 负号是动系b看固定系i是相反的&#xff1b; 一个固定 在惯性导航解算中&#xff0c;旋转矢量的叉乘用于描述姿态矩阵的微分方程。你提到的公式中&#xff0c; ω i b b \boldsymbol{\omega}_{ib}^b \times ωibb…...

【大语言模型】【整合版】DeepSeek 模型提示词学习笔记(散装的可以看我之前的学习笔记,这里只是归纳与总结了一下思路,内容和之前发的差不多)

以下是个人笔记的正文内容: 原文在FlowUs知识库上&#xff0c;如下截图。里面内容和这里一样&#xff0c;知识排版好看一点 一、什么是 DeepSeek 1. DeepSeek 简介 DeepSeek 是一家专注于通用人工智能&#xff08;AGI&#xff09;的中国科技公司&#xff0c;主攻大模型研发与…...

ollama无法通过IP:11434访问

目录 1.介绍 2.直接在ollama的当前命令窗口中修改&#xff08;法1&#xff09; 3.更改ollama配置文件&#xff08;法2&#xff09; 3.1更新配置 3.2重启服务 1.介绍 ollama下载后默认情况下都是直接在本地的11434端口中运行&#xff0c;绑定到127.0.0.1(localhost)&#x…...

⭐算法OJ⭐位操作用法总结+实战指南(C++实现)

位操作在OJ 题目中是一种非常高效的工具&#xff0c;常用于优化时间复杂度和空间复杂度。本文是位操作在 OJ 题目中的主要用法总结&#xff0c;并以 C 实现为例。 相关题目&#xff1a;《C⭐算法OJ⭐Single Number 系列&#xff08;位操作&#xff09;》 文章目录 1. 基本位操…...

2.1 用大模型构建新人答疑机器人-大模型ACP模拟题-真题

真题 真题&#xff1a;如何初始化OpenAI客户端 client OpenAI( api_keyos.getenv("DASHSCOPE_API_KEY"), base_url"https://dashscope.aliyuncs.com/compatible-mode/v1", ) AI生成模拟题 一、单选题 &#xff08;每题5分&#xff0c;共6题&#xff…...