通过网络编程实现一个C/S模式的员工管理系统,服务器端用多进程或多线程模型支持多个客户端同时连接、操作。具体要求如下: (1)员工信息包括三个字段:姓名,年龄,手机号,用结构体表示;

时间: 2023-05-25 08:02:41 浏览: 76
(2)支持添加员工、删除员工、查看所有员工信息、按照年龄排序查看员工信息等操作; (3)服务器端和客户端之间通过套接字进行通信,服务器接收客户端请求并处理,返回相应的结果; (4)服务器端需要支持多个客户端的同时连接和操作; (5)服务器端采用多进程或多线程模型均可。 下面是一个示例的服务器端代码实现: ```c++ #include <iostream> #include <cstdlib> #include <cstring> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <pthread.h> #include <vector> #include <algorithm> using namespace std; // 员工信息结构体 struct Employee { string name; int age; string phone; Employee(string n = "", int a = 0, string p = "") { name = n; age = a; phone = p; } }; // 员工信息数据 vector<Employee> employees; // 线程处理函数 void *handle_client(void *client_socket_ptr) { // 取出客户端socket int client_socket = *((int *) client_socket_ptr); while (true) { // 接收客户端数据 char buffer[1024]; int recv_len = recv(client_socket, buffer, sizeof(buffer), 0); if (recv_len <= 0) { // 接收失败或客户端关闭连接,退出线程 break; } buffer[recv_len] = '\0'; // 保证字符串以'\0'结尾 // 解析客户端数据 string request(buffer); // 处理客户端请求 string response; if (request == "quit") { // 客户端请求退出 response = "BYE"; break; } else if (request == "list") { // 客户端请求列出所有员工信息 response = "NAME\tAGE\tPHONE\n"; for (auto e : employees) { response += e.name + "\t" + to_string(e.age) + "\t" + e.phone + "\n"; } } else if (request == "add") { // 客户端请求添加员工信息 char name[256], phone[256]; int age; sscanf(buffer, "add %s %d %s", name, &age, phone); employees.emplace_back(name, age, phone); response = "OK"; } else if (request == "rm") { // 客户端请求删除某个员工信息 char name[256]; sscanf(buffer, "rm %s", name); auto it = find_if(employees.begin(), employees.end(), [&](Employee e) { return e.name == name; }); if (it != employees.end()) { employees.erase(it); response = "OK"; } else { response = "NOT FOUND"; } } else if (request == "age") { // 客户端请求按照年龄排序显示员工信息 sort(employees.begin(), employees.end(), [&](Employee a, Employee b) { return a.age < b.age; }); response = "NAME\tAGE\tPHONE\n"; for (auto e : employees) { response += e.name + "\t" + to_string(e.age) + "\t" + e.phone + "\n"; } } else { // 客户端请求不合法 response = "INVALID COMMAND"; } // 发送响应给客户端 send(client_socket, response.c_str(), response.size(), 0); } // 关闭客户端socket close(client_socket); // 释放客户端socket堆空间 delete (int *) client_socket_ptr; // 线程退出 return nullptr; } int main(int argc, char *argv[]) { // 创建服务器socket int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (server_socket < 0) { cerr << "ERROR: Failed to create server socket." << endl; return 1; } // 绑定服务器地址和端口号 struct sockaddr_in server_addr{}; 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(12345); if (bind(server_socket, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) { cerr << "ERROR: Failed to bind server address." << endl; close(server_socket); return 1; } // 开始监听客户端连接 if (listen(server_socket, 10) < 0) { cerr << "ERROR: Failed to listen on server socket." << endl; close(server_socket); return 1; } // 主线程等待客户端连接并创建线程处理客户端请求 pthread_t tid; while (true) { // 等待客户端连接 struct sockaddr_in client_addr{}; socklen_t client_addr_len = sizeof(client_addr); int client_socket = accept(server_socket, (struct sockaddr *) &client_addr, &client_addr_len); if (client_socket < 0) { cerr << "ERROR: Failed to accept client connection." << endl; continue; } // 创建线程处理客户端请求 int *client_socket_ptr = new int(client_socket); // 需要堆上分配空间,以便在线程函数内部释放 int rc = pthread_create(&tid, nullptr, handle_client, (void *) client_socket_ptr); if (rc != 0) { cerr << "ERROR: Failed to create client thread." << endl; close(client_socket); delete client_socket_ptr; continue; } // 线程分离 pthread_detach(tid); } // 关闭服务器socket close(server_socket); return 0; } ``` 其中,主线程不断地等待客户端连接并创建线程处理客户端请求,每个线程函数中实现具体的员工管理操作:收到客户端请求后进行解析,然后调用相应的函数进行处理,并将处理结果发送回客户端。实现方式比较简单,使用了C++标准库中的vector、algorithm等容器和算法处理员工信息,使用了线程库pthread实现了多线程模型。在main函数中并未指定多进程或多线程模型,可以根据实际需要选择。

相关推荐

最新推荐

recommend-type

Python 多线程+多进程简单使用教程,如何在多进程开多线程

一、Python多进程多线程 关于python多进程多线程的相关基础知识,在我之前的博客有写过,并且就关于python多线程的GIL锁问题,也在我的一篇博客中有相关的解释。 为什么python多线程在面对IO密集型任务的时候会产生...
recommend-type

详解Java中多进程编程的实现

主要介绍了详解Java中多进程编程的实现,和多线程一样,多进程同样是实现并发的一种方式,需要的朋友可以参考下
recommend-type

Python中使用多进程来实现并行处理的方法小结

本篇文章主要介绍了Python中使用多进程来实现并行处理的方法小结,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

python multiprocessing多进程变量共享与加锁的实现

主要介绍了python multiprocessing多进程变量共享与加锁的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

C#使用读写锁三行代码简单解决多线程并发的问题

本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题。需要的朋友可以参考借鉴
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

解释这行代码 c = ((double)rand() / RAND_MAX) * (a + b - fabs(a - b)) + fabs(a - b);

这行代码是用于生成 a 和 b 之间的随机数。首先,它使用 rand() 函数生成一个 [0,1) 之间的随机小数,然后将这个小数乘以 a、b 范围内的差值,再加上 a 和 b 中的较小值。这可以确保生成的随机数大于等于 a,小于等于 b,而且不会因为 a 和 b 之间的差距过大而导致难以生成足够多的随机数。最后,使用 fabs() 函数来确保计算结果是正数。
recommend-type

JSBSim Reference Manual

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