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

ops/2025/2/26 10:02:54/

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)

http://www.ppmy.cn/ops/161387.html

相关文章

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取 一、问题背景 政府的icp备案时&#xff0c;或者某些三方SDK以来的管理后台&#xff0c;都需要配置鸿蒙应用的公钥和证书MD5指纹 二、解决方案 专有名词解释&#xff1a; 华为AppGallery Connect简称 AGC平台&#xff0…

java spring 是什么_Spring详解(一)------概述

本系列教程我们将对 Spring 进行详解的介绍&#xff0c;相信你在看完后一定能够有所收获。 1、什么是 Spring Spring是一个开源框架&#xff0c;Spring是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由Rod Johnson 在其著作Expert One-On-One J2EE Development and…

Ollama部署与常用命令

Ollama是一款开源工具&#xff0c;其目标是简化大语言模型在本地环境的部署和使用。它支持多种流行的开源大语言模型&#xff0c;如 Llama 2、Qwen2.5等。 通过Ollama&#xff0c;用户无需具备深厚的技术背景&#xff0c;就能在普通的消费级硬件上快速搭建一个强大的语言处理环…

Spring Boot集成RocketMQ:真实项目应用场景

第一部分&#xff1a;基础配置与简单示例 1. 项目初始化 使用Spring Boot创建一个项目&#xff0c;添加RocketMQ依赖。 POM依赖&#xff08;Maven&#xff09;&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

白帽黑客系列教程之Windows驱动开发(64位环境)入门教程(四)

为什么要写这篇文章呢&#xff1f; 作为一名白帽黑客&#xff0c;如果想要学习ROOTKIT攻防技术&#xff0c;就必须要有能力进行驱动开发&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 在Windows操作系统的64位环境中&#xff0c;进行ROOTKIT攻…

网络安全与措施

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 # 网络安全问题概述 1) 数据安全 访问&#xff08;授权访问&#xff09;&#xff1b;存储&#xff08;容灾、备份或异地备份等&#xff09; 2) 应用程序 不能…

2.25力扣-回溯组合总和

39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 一&#xff1a;Java class Solution {List<List<Integer>> ansnew LinkedList<>();List<Integer> tempnew LinkedList<>();int sum0;public List<List<Integer>> combinatio…

阶跃星辰的开源探索:Step-Video-T2V 与 Step-Audio 深度解析

一、引言 在人工智能&#xff08;AI&#xff09;技术迅猛发展的今天&#xff0c;多模态 AI 模型的开源成为行业发展的重要趋势。近年来&#xff0c;文本生成&#xff08;NLP&#xff09;、图像生成&#xff08;Diffusion Model&#xff09;以及语音合成&#xff08;TTS&#x…