在Windows环境下编写具体的C语言代码实现远程log保存、查询功能 1、实现一个tcp server端 2、实现一个tcp client端 3、server端和client自己设计简单的协议(如read_log write_log get_res 等等) 4、log保存在server端 5、client 通过socket向server端发送请求 写一条log/读所有log/计算数据采集结果 6、server通过socket返回响应Client查询结果 7、当client异常退出时,server端应该有对应的处理机制(自行设计处理机制) 8、server端的log打印不做任何要求,但是client正常/异常离线需要有对应的log,请编写出具体的代码给我

时间: 2024-02-16 16:00:51 浏览: 22
以下是一个简单的C语言代码实现远程log保存、查询功能的示例: server.c ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #define PORT 8888 #define BUF_SIZE 1024 #define LOG_FILE "log.txt" struct client_info { SOCKET socket; int is_online; }; void save_log(const char *log) { FILE *fp = fopen(LOG_FILE, "a"); if (fp == NULL) { printf("Failed to open log file\n"); return; } fprintf(fp, "%s\n", log); fclose(fp); } void handle_request(SOCKET socket, const char *buf, struct client_info *clients, int num_clients) { char response[BUF_SIZE]; char cmd[BUF_SIZE], arg[BUF_SIZE]; int i, online_clients = 0; sscanf(buf, "%s %s", cmd, arg); if (strcmp(cmd, "write_log") == 0) { save_log(arg); sprintf(response, "OK"); } else if (strcmp(cmd, "read_log") == 0) { FILE *fp = fopen(LOG_FILE, "r"); if (fp == NULL) { sprintf(response, "Failed to open log file"); } else { response[0] = '\0'; while (fgets(buf, BUF_SIZE, fp) != NULL) { strcat(response, buf); } fclose(fp); } } else if (strcmp(cmd, "get_res") == 0) { for (i = 0; i < num_clients; i++) { if (clients[i].is_online) { online_clients++; } } sprintf(response, "Online clients: %d", online_clients); } else { sprintf(response, "Invalid command"); } send(socket, response, strlen(response), 0); } void handle_client(SOCKET socket, struct client_info *clients, int num_clients) { char buf[BUF_SIZE]; int nbytes, i, client_index = -1; for (i = 0; i < num_clients; i++) { if (clients[i].socket == INVALID_SOCKET) { client_index = i; break; } } if (client_index == -1) { printf("Too many clients, closing connection\n"); closesocket(socket); return; } clients[client_index].socket = socket; clients[client_index].is_online = 1; printf("Client connected\n"); while ((nbytes = recv(socket, buf, BUF_SIZE, 0)) > 0) { buf[nbytes] = '\0'; printf("Received: %s\n", buf); handle_request(socket, buf, clients, num_clients); } printf("Client disconnected\n"); closesocket(socket); clients[client_index].socket = INVALID_SOCKET; clients[client_index].is_online = 0; } int main() { WSADATA wsa; SOCKET listen_socket, client_socket; struct sockaddr_in server_addr, client_addr; int addr_len = sizeof(client_addr); struct client_info clients[10]; int i; for (i = 0; i < 10; i++) { clients[i].socket = INVALID_SOCKET; clients[i].is_online = 0; } if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { printf("Failed to initialize Winsock\n"); return 1; } if ((listen_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { printf("Failed to create socket\n"); return 1; } server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(PORT); if (bind(listen_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) { printf("Failed to bind socket\n"); return 1; } if (listen(listen_socket, 10) == SOCKET_ERROR) { printf("Failed to listen on socket\n"); return 1; } printf("Server listening on port %d\n", PORT); while (1) { if ((client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, &addr_len)) == INVALID_SOCKET) { printf("Failed to accept connection\n"); continue; } handle_client(client_socket, clients, 10); } closesocket(listen_socket); WSACleanup(); return 0; } ``` client.c ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #define SERVER_ADDR "127.0.0.1" #define PORT 8888 #define BUF_SIZE 1024 int send_request(SOCKET socket, const char *buf) { int nbytes = send(socket, buf, strlen(buf), 0); if (nbytes == SOCKET_ERROR) { printf("Failed to send request\n"); return 0; } return 1; } int main() { WSADATA wsa; SOCKET socket; struct sockaddr_in server_addr; char buf[BUF_SIZE]; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { printf("Failed to initialize Winsock\n"); return 1; } if ((socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { printf("Failed to create socket\n"); return 1; } server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR); server_addr.sin_port = htons(PORT); if (connect(socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) { printf("Failed to connect to server\n"); return 1; } printf("Connected to server\n"); while (1) { printf("> "); fgets(buf, BUF_SIZE, stdin); if (buf[strlen(buf) - 1] == '\n') { buf[strlen(buf) - 1] = '\0'; } if (strcmp(buf, "quit") == 0) { break; } if (!send_request(socket, buf)) { continue; } if (recv(socket, buf, BUF_SIZE, 0) > 0) { buf[strlen(buf)] = '\0'; printf("Response: %s\n", buf); } else { printf("Failed to receive response\n"); } } closesocket(socket); WSACleanup(); return 0; } ``` 启动server后,可以使用client向server发送请求,如: ``` write_log test log message read_log get_res ``` server会对请求进行处理,并返回相应的响应。

相关推荐

最新推荐

recommend-type

完美解决SQL server 5173问题(一个或多个文件与数据库的主文件不匹配)

消息 5173,级别 16,状态 2,第 1 行 一个或多个文件与数据库的主文件不匹配。如果是尝试附加数据库,请使用正确的文件重试该操作。如果这是现有数据库,则文件可能已损坏,应该从备份进行还原。 如果出现这个错误...
recommend-type

Springboot项目使用Slf4j将日志保存到本地目录的实现代码

主要介绍了Springboot项目使用Slf4j将日志保存到本地目录的实现方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

git log根据特定条件查询日志并统计修改的代码行数

主要介绍了git log根据特定条件查询日志并统计修改的代码行数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

MongoDB聚合分组取第一条记录的案例与实现方法

今天开发同学向我们提了一个紧急的需求,从集合mt_resources_access_log中,根据字段refererDomain分组,取分组中最近一笔插入的数据,然后将这些符合条件的数据导入到集合mt_resources_access_log_new中。...
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://picx.zhimg.com/80/v2-8132d9acfebe1c248865e24dc5445720_1440w.webp?source=1def8aca) # 1. MATLAB结构体基础** MATLAB结构体是一种数据结构,用于存储和组织相关数据。它由一系列域组成,每个域都有一个名称和一个值。结构体提供了对数据的灵活访问和管理,使其成为组织和处理复杂数据集的理想选择。 MATLAB中创建结构体非常简单,使用struct函数即可。例如: ```matlab myStruct
recommend-type

详细描述一下STM32F103C8T6怎么与DHT11连接

STM32F103C8T6可以通过单总线协议与DHT11连接。连接步骤如下: 1. 将DHT11的VCC引脚连接到STM32F103C8T6的5V电源引脚; 2. 将DHT11的GND引脚连接到STM32F103C8T6的GND引脚; 3. 将DHT11的DATA引脚连接到STM32F103C8T6的GPIO引脚,可以选择任一GPIO引脚,需要在程序中配置; 4. 在程序中初始化GPIO引脚,将其设为输出模式,并输出高电平,持续至少18ms,以激活DHT11; 5. 将GPIO引脚设为输入模式,等待DHT11响应,DHT11会先输出一个80us的低电平,然后输出一个80us的高电平,
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。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依