C语言TCP编写的员工管理系统的服务端
时间: 2024-05-15 15:13:46 浏览: 93
C语言编写的员工管理系统
以下是一个简单的员工管理系统的服务端示例,使用C语言和TCP协议进行编写。该系统可以实现员工信息的增删改查等基本功能。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define PORT 8888
#define MAXLINE 1024
struct Employee {
int id;
char name[20];
int age;
float salary;
};
int main(int argc, char *argv[]) {
int listenfd, connfd;
struct sockaddr_in servaddr, cliaddr;
char buf[MAXLINE];
char sendbuf[MAXLINE];
int n;
struct Employee employees[100];
int count = 0;
// 初始化员工信息
employees[0].id = 1001;
strcpy(employees[0].name, "张三");
employees[0].age = 28;
employees[0].salary = 8000.0;
count++;
employees[1].id = 1002;
strcpy(employees[1].name, "李四");
employees[1].age = 32;
employees[1].salary = 10000.0;
count++;
// 创建socket
listenfd = socket(AF_INET, SOCK_STREAM, 0);
// 初始化服务器地址结构体
bzero(&servaddr, sizeof(servaddr)); // 将地址结构体清零
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 任意IP地址
servaddr.sin_port = htons(PORT);
// 绑定地址结构体到socket
bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
// 监听socket
listen(listenfd, 10);
printf("员工管理系统服务端已启动...\n");
while (1) {
socklen_t clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);
printf("客户端 %s:%d 已连接\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
while ((n = read(connfd, buf, MAXLINE)) > 0) {
buf[n] = '\0';
printf("客户端 %s:%d 发来消息: %s\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port), buf);
if (strcmp(buf, "quit") == 0) {
break;
} else if (strcmp(buf, "list") == 0) {
// 列出所有员工信息
memset(sendbuf, 0, sizeof(sendbuf));
sprintf(sendbuf, "编号\t姓名\t年龄\t工资\n");
for (int i = 0; i < count; i++) {
sprintf(sendbuf + strlen(sendbuf), "%d\t%s\t%d\t%.2f\n", employees[i].id, employees[i].name, employees[i].age, employees[i].salary);
}
write(connfd, sendbuf, strlen(sendbuf));
} else if (strncmp(buf, "add", 3) == 0) {
// 添加员工信息
char *p = strtok(buf + 4, ",");
struct Employee emp;
emp.id = atoi(p);
p = strtok(NULL, ",");
strcpy(emp.name, p);
p = strtok(NULL, ",");
emp.age = atoi(p);
p = strtok(NULL, ",");
emp.salary = atof(p);
employees[count++] = emp;
write(connfd, "添加成功", strlen("添加成功"));
} else if (strncmp(buf, "del", 3) == 0) {
// 删除员工信息
int id = atoi(buf + 4);
int index = -1;
for (int i = 0; i < count; i++) {
if (employees[i].id == id) {
index = i;
break;
}
}
if (index == -1) {
write(connfd, "未找到该员工", strlen("未找到该员工"));
} else {
for (int i = index; i < count - 1; i++) {
employees[i] = employees[i + 1];
}
count--;
write(connfd, "删除成功", strlen("删除成功"));
}
} else {
write(connfd, "无效的命令", strlen("无效的命令"));
}
}
close(connfd);
printf("客户端 %s:%d 已断开连接\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
}
return 0;
}
```
在运行该程序之前,请确保已经安装了C语言的编译器和网络编程相关的库文件。
该程序使用了一个 Employee 结构体来存储员工的信息,并提供了 list、add、del 三种操作来对员工信息进行管理。其中,list 命令可以列出所有员工信息,add 命令可以添加新员工信息,del 命令可以删除指定编号的员工信息。
注意,该程序只是一个简单的示例,还有很多需要优化和改进的地方,例如数据存储方式、异常处理等。实际使用中需要根据具体情况进行改进。
阅读全文