用c语言编写一个聊天服务器和聊天的客户端,实现基本的即时聊天功能。服务器在一个端口上进行监听,接收客户端的连接请求;客户端连接到服务器,发布自己的消息;服务器接收客户端的消息并转发给其他客户端。

时间: 2024-03-12 11:44:36 浏览: 19
好的,以下是使用C语言实现基本即时聊天功能的服务器和客户端程序。 服务器程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <netinet/in.h> #include <unistd.h> #include <pthread.h> #define SERVER_PORT 8888 #define MAX_CLIENTS 10 int client_count = 0; int client_sockets[MAX_CLIENTS]; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void *handle_client(void *arg) { int client_socket = *(int*)arg; char buffer[1024]; int read_size; while ((read_size = recv(client_socket, buffer, sizeof(buffer), 0)) > 0) { buffer[read_size] = '\0'; printf("Received message: %s", buffer); pthread_mutex_lock(&mutex); // 转发消息给其他客户端 for (int i = 0; i < client_count; i++) { if (client_sockets[i] != client_socket) { send(client_sockets[i], buffer, strlen(buffer), 0); } } pthread_mutex_unlock(&mutex); } // 关闭连接 close(client_socket); pthread_mutex_lock(&mutex); // 从客户端列表中删除 for (int i = 0; i < client_count; i++) { if (client_sockets[i] == client_socket) { client_sockets[i] = 0; break; } } client_count--; pthread_mutex_unlock(&mutex); pthread_exit(NULL); } int main() { int server_socket, client_socket; struct sockaddr_in server_addr, client_addr; // 创建socket对象 server_socket = socket(AF_INET, SOCK_STREAM, 0); if (server_socket < 0) { perror("socket"); exit(EXIT_FAILURE); } // 绑定IP和端口 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(SERVER_PORT); if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("bind"); exit(EXIT_FAILURE); } // 开始监听 if (listen(server_socket, MAX_CLIENTS) < 0) { perror("listen"); exit(EXIT_FAILURE); } printf("Server is listening on port %d\n", SERVER_PORT); // 等待客户端连接 while (1) { socklen_t client_len = sizeof(client_addr); client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_len); if (client_socket < 0) { perror("accept"); exit(EXIT_FAILURE); } printf("New client connected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); pthread_mutex_lock(&mutex); // 添加到客户端列表 for (int i = 0; i < MAX_CLIENTS; i++) { if (client_sockets[i] == 0) { client_sockets[i] = client_socket; client_count++; break; } } pthread_mutex_unlock(&mutex); // 创建新线程处理客户端消息 pthread_t thread; if (pthread_create(&thread, NULL, handle_client, (void*)&client_socket) < 0) { perror("pthread_create"); exit(EXIT_FAILURE); } } return 0; } ``` 客户端程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <netinet/in.h> #include <unistd.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8888 int main() { int client_socket; struct sockaddr_in server_addr; // 创建socket对象 client_socket = socket(AF_INET, SOCK_STREAM, 0); if (client_socket < 0) { perror("socket"); exit(EXIT_FAILURE); } // 连接服务器 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); server_addr.sin_port = htons(SERVER_PORT); if (connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("connect"); exit(EXIT_FAILURE); } // 发送消息 char buffer[1024]; printf("Enter message: "); fgets(buffer, sizeof(buffer), stdin); send(client_socket, buffer, strlen(buffer), 0); // 接收服务器返回的消息 memset(buffer, 0, sizeof(buffer)); recv(client_socket, buffer, sizeof(buffer), 0); printf("Received message: %s", buffer); // 关闭连接 close(client_socket); return 0; } ``` 这是一个比较基础的聊天服务器和客户端程序,您可以根据自己的需求进行改进和扩展。

相关推荐

最新推荐

recommend-type

基于Linux操作系统C语言开发的多人聊天室程序设计与实现.docx

里面附有源代码,加上详细的设计步骤,使用了C语言开发,功能有服务器和客户端的消息接收与发送,以及退出功能
recommend-type

socket多人聊天程序C语言版(一)

主要为大家详细介绍了socket多人聊天程序C语言版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

超简单的ntrip客户端C语言实现.docx

NTRIP协议是基于HTTP实现的,各种硬件的TCP连接不一样,所以TCP的连接,文件中不包含。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用前端写一个树形控件读取指定目录的文件夹结构

抱歉,作为AI语言模型,我无法提供完整的前端代码。但是,我可以给您一些指导和建议: 1. 使用递归函数来读取指定目录下的所有子文件夹和文件。 2. 在HTML中使用ul和li标签来构建树形结构。 3. 使用CSS样式来美化树形控件。 4. 使用JavaScript来实现树形控件的交互功能(如展开/收起节点)。 5. 使用Ajax或fetch等技术来异步加载子节点,以提高性能。 6. 如果需要支持拖拽等交互功能,可以考虑使用第三方插件或库(如jQuery UI)。 希望这些建议对您有所帮助!
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB柱状图在数据分析中的作用:从可视化到洞察

![MATLAB柱状图在数据分析中的作用:从可视化到洞察](https://img-blog.csdnimg.cn/img_convert/1a36558cefc0339f7836cca7680c0aef.png) # 1. MATLAB柱状图概述** 柱状图是一种广泛用于数据可视化的图表类型,它使用垂直条形来表示数据中不同类别或组别的值。在MATLAB中,柱状图通过`bar`函数创建,该函数接受数据向量或矩阵作为输入,并生成相应的高度条形。 柱状图的优点在于其简单性和易于理解性。它们可以快速有效地传达数据分布和组别之间的比较。此外,MATLAB提供了广泛的定制选项,允许用户调整条形颜色、