服务端客户端相互通信的实现,请多线程实现,请给出相应c代码

时间: 2023-12-06 09:03:11 浏览: 27
以下是一个简单的多线程客户端和服务器端通信的示例代码,使用C语言编写。 服务器端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <pthread.h> #define MAX_CLIENTS 5 #define BUF_SIZE 1024 void *connection_handler(void *); int main(int argc, char *argv[]) { int socket_desc, client_sock, c, *new_sock; struct sockaddr_in server, client; char *message; // 创建套接字 socket_desc = socket(AF_INET, SOCK_STREAM, 0); if (socket_desc == -1) { printf("Could not create socket"); } // 准备服务器结构体 server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(8888); // 绑定套接字 if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) { perror("bind failed. Error"); return 1; } // 监听套接字 listen(socket_desc, MAX_CLIENTS); printf("Waiting for incoming connections...\n"); c = sizeof(struct sockaddr_in); while ((client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t *)&c))) { printf("Connection accepted from %s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); // 创建新线程处理连接 pthread_t sniffer_thread; new_sock = malloc(1); *new_sock = client_sock; if (pthread_create(&sniffer_thread, NULL, connection_handler, (void *)new_sock) < 0) { perror("could not create thread"); return 1; } printf("Handler assigned\n"); } if (client_sock < 0) { perror("accept failed"); return 1; } return 0; } void *connection_handler(void *socket_desc) { int sock = *(int *)socket_desc; int read_size; char client_message[BUF_SIZE]; // 接收消息并发送回复 while ((read_size = recv(sock, client_message, BUF_SIZE, 0)) > 0) { printf("Received message: %s\n", client_message); if (write(sock, client_message, strlen(client_message)) < 0) { perror("write failed"); return NULL; } memset(client_message, 0, BUF_SIZE); } if (read_size == 0) { printf("Client disconnected\n"); } else if (read_size == -1) { perror("recv failed"); } free(socket_desc); return NULL; } ``` 客户端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define BUF_SIZE 1024 int main(int argc, char *argv[]) { int sock; struct sockaddr_in server; char message[BUF_SIZE], server_reply[BUF_SIZE]; // 创建套接字 sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { printf("Could not create socket"); } // 准备服务器结构体 server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_family = AF_INET; server.sin_port = htons(8888); // 连接服务器 if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) { perror("connect failed. Error"); return 1; } printf("Connected to server\n"); // 发送消息并接收回复 while (1) { printf("Enter message: "); fgets(message, BUF_SIZE, stdin); if (write(sock, message, strlen(message)) < 0) { perror("write failed"); return 1; } if (read(sock, server_reply, BUF_SIZE) < 0) { perror("read failed"); return 1; } printf("Server reply: %s\n", server_reply); memset(message, 0, BUF_SIZE); memset(server_reply, 0, BUF_SIZE); } close(sock); return 0; } ``` 该示例中,服务器可以同时处理多个客户端连接,每个客户端连接都会创建一个新线程来处理。在客户端,用户可以输入消息并发送给服务器,服务器接收消息并回复相同的消息给客户端。这个示例中仅仅只是简单的演示了客户端和服务器的基本通信流程,可以根据实际需求进行调整和扩展。

相关推荐

最新推荐

recommend-type

java多线程实现服务器端与多客户端之间的通信

本篇文章主要介绍了java多线程实现服务器端与多客户端之间的通信,介绍了多线程来实现服务器与多线程之间的通信的基本步骤,有需要的小伙伴可以参考下。
recommend-type

C语言编写基于TCP和UDP协议的Socket通信程序示例

主要介绍了C语言编写基于TCP和UDP协议的Socket通信程序示例,其中TCP的客户端与服务器端采用多线程实现,需要的朋友可以参考下
recommend-type

[C#通信二]C#.net同步异步SOCKET通讯和多线程总结

C#.net同步异步SOCKET通讯和多线程总结 同步套接字通信 Socket支持下的网上点对点的通信 服务端实现监听连接,客户端实现发送连接请求,建立连接后进行发送和接收数据的功能 服务器端建立一个socket,设置好本机的ip...
recommend-type

grpcio-1.63.0-cp38-cp38-linux_armv7l.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
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

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
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。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依