From b4704ad02446945b0271488ca5e8619a29557625 Mon Sep 17 00:00:00 2001 From: lingel <2894340009@qq.com> Date: Wed, 29 May 2024 09:06:11 +0800 Subject: [PATCH] =?UTF-8?q?controller=E7=9A=84=E4=B8=89=E4=B8=AA=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E6=95=B0=E6=8D=AE=E5=BA=93=E5=88=9D=E6=AD=A5?= =?UTF-8?q?=E6=8E=A2=E7=A9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller-v1.1/client | Bin 0 -> 17016 bytes src/controller-v1.1/connector_controller.cpp | 51 ++++ src/controller-v1.1/connector_gateway.cpp | 57 ++++ src/controller-v1.1/epollip/client | Bin 0 -> 93568 bytes .../epollip/connector_controller.cpp | 288 ++++++++++++++++++ .../epollip/connector_database.cpp | 31 ++ .../epollip/connector_gateway.cpp | 86 ++++++ .../epollip/db_processer/basic_db.cpp | 66 ++++ src/controller-v1.1/epollip/myapp | Bin 0 -> 16816 bytes src/controller-v1.1/epollip/new_client.cpp | 125 ++++++++ src/controller-v1.1/epollip/newclient | Bin 0 -> 74640 bytes src/controller-v1.1/epollip/server | Bin 0 -> 33080 bytes src/controller-v1.1/server | Bin 0 -> 17120 bytes 13 files changed, 704 insertions(+) create mode 100644 src/controller-v1.1/client create mode 100644 src/controller-v1.1/connector_controller.cpp create mode 100644 src/controller-v1.1/connector_gateway.cpp create mode 100644 src/controller-v1.1/epollip/client create mode 100644 src/controller-v1.1/epollip/connector_controller.cpp create mode 100644 src/controller-v1.1/epollip/connector_database.cpp create mode 100644 src/controller-v1.1/epollip/connector_gateway.cpp create mode 100644 src/controller-v1.1/epollip/db_processer/basic_db.cpp create mode 100644 src/controller-v1.1/epollip/myapp create mode 100644 src/controller-v1.1/epollip/new_client.cpp create mode 100644 src/controller-v1.1/epollip/newclient create mode 100644 src/controller-v1.1/epollip/server create mode 100644 src/controller-v1.1/server diff --git a/src/controller-v1.1/client b/src/controller-v1.1/client new file mode 100644 index 0000000000000000000000000000000000000000..6d0266e2f2a3e12b13eae433367aa7c43bc3c19e GIT binary patch literal 17016 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 XPB?0pbn$X6WdHC=p;7HJaIx&)b1$hn literal 0 HcmV?d00001 diff --git a/src/controller-v1.1/connector_controller.cpp b/src/controller-v1.1/connector_controller.cpp new file mode 100644 index 0000000..0e8a9e4 --- /dev/null +++ b/src/controller-v1.1/connector_controller.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include +#define PORT 8888 + +int main() { + int sock = 0; + struct sockaddr_in server_addr; + const char *message = "Hello Server"; + char buffer[1024] = {0}; + int valread; + + // Creating socket + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + std::cerr << "Socket creation failed" << std::endl; + return -1; + } + + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(PORT); + + // Get server address + if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) { + std::cerr << "Invalid address or Address not supported" << std::endl; + return -1; + } + + // Connect the client socket to the server + if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { + std::cerr << "Connection with the server failed" << std::endl; + return -1; + } + + // Send some data + if (send(sock, message, strlen(message), 0) < 0) { + std::cerr << "Send failed" << std::endl; + return -1; + } + + printf("Message sent\n"); + + // Receive a reply from the server + valread = read(sock, buffer, 1024); + printf("Message from server : %s\n", buffer); + + close(sock); + return 0; +} \ No newline at end of file diff --git a/src/controller-v1.1/connector_gateway.cpp b/src/controller-v1.1/connector_gateway.cpp new file mode 100644 index 0000000..84eeaa9 --- /dev/null +++ b/src/controller-v1.1/connector_gateway.cpp @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include + +#define PORT 8888 + +int main() { + int server_fd, new_socket; + struct sockaddr_in address; + int opt = 1; + int addrlen = sizeof(address); + char buffer[1024] = {0}; + const char *response = "Hello Client, I have received your data"; + + // Creating socket + if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { + perror("Socket creation failed"); + exit(EXIT_FAILURE); + } + + // Forcefully attaching socket to the port 8080 + if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { + perror("Setsockopt failed"); + exit(EXIT_FAILURE); + } + address.sin_family = AF_INET; + address.sin_addr.s_addr = INADDR_ANY; + address.sin_port = htons(PORT); + + // Forcefully attaching socket to the port 8080 + if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { + perror("Bind failed"); + exit(EXIT_FAILURE); + } + if (listen(server_fd, 3) < 0) { + perror("Listen failed"); + exit(EXIT_FAILURE); + } + + if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { + perror("Accept failed"); + exit(EXIT_FAILURE); + } + + read(new_socket, buffer, 1024); + std::cout << "Message from client: " << buffer << std::endl; + + // send the message back to the client + send(new_socket, response, strlen(response), 0); + printf("Hello message sent\n"); + + close(new_socket); + close(server_fd); + return 0; +} \ No newline at end of file diff --git a/src/controller-v1.1/epollip/client b/src/controller-v1.1/epollip/client new file mode 100644 index 0000000000000000000000000000000000000000..d36b549fbf6d02119000c6ac1e0077ac16c5b28d GIT binary patch literal 93568 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

hH}lU{}#QLkGRb|WOXGl~O? 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 c-A|9k`})zZ<4sln#}0Lbw|t=1A^SM^ANo7 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BUFFER_SIZE 1024 +#define HTTP_SERVER_PORT 8080 + +std::vector threads; // 存储所有连接线程 +std::map sockets; // 存储套接字 +std::mutex sockets_mutex; // 用于同步访问 sockets +std::atomic exit_flag(false); // 原子退出标志 + + +// 维护连接的函数 +void KeepConnection(int sock) { + char buffer[BUFFER_SIZE]; + int nbytes; + while (!exit_flag) { + nbytes = recv(sock, buffer, BUFFER_SIZE, 0); + if (nbytes <= 0) { + std::cout << "Gateway disconnected" << std::endl; + break; + } + std::cout << "Received from gateway (Socket " << sock << "): " << buffer << std::endl; + } + + { + std::lock_guard lock(sockets_mutex); + sockets.erase(sock); // 从集合中移除套接字 + } + close(sock); +} +// 连接到网关的函数 +void ConnectToGateway(const std::string& ip, int port) { + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + perror("Could not create socket"); + return; + } + + struct sockaddr_in server_addr; + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(port); + if (inet_pton(AF_INET, ip.c_str(), &server_addr.sin_addr) <= 0) { + perror("Invalid address"); + close(sock); + return; + } + + if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { + perror("Connection to the server failed"); + close(sock); + return; + } + + { + std::lock_guard lock(sockets_mutex); + sockets[sock] = 1; // 将套接字添加到集合中 + } + + std::cout << "Connected to gateway at " << ip << ":" << port << " (Socket " << sock << ")" << std::endl; + + // 在新线程中维护连接 + threads.emplace_back(KeepConnection, sock); +} + +// 处理HTTP请求的函数 +void HandleHttpRequest(int client_socket) { + char buffer[BUFFER_SIZE]; + int bytes_read = recv(client_socket, buffer, sizeof(buffer), 0); + if (bytes_read <= 0) { + close(client_socket); + return; + } + + // 简单解析HTTP请求 + std::string http_request(buffer, bytes_read); + std::string ip; + int port; + + // 寻找IP和端口号 + auto host_pos = http_request.find("Host: "); + if (host_pos != std::string::npos) { + auto start = host_pos + std::string("Host: ").size(); + ip = http_request.substr(start, http_request.find("\r\n", start) - start); + } + + auto content_length_pos = http_request.find("Content-Length:"); + if (content_length_pos != std::string::npos) { + auto start = content_length_pos + std::string("Content-Length: ").size(); + int length = std::stoi(http_request.substr(start, http_request.find("\r\n", start) - start)); + if (length > 0) { + char* content = new char[length]; + bytes_read = recv(client_socket, content, length, 0); + if (bytes_read > 0) { + // 解析JSON内容(假设前端发送的是JSON格式) + // 这里需要添加JSON解析逻辑来提取IP和端口 + // 示例:{"ip":"192.168.1.1","port":8080} + // 可以使用第三方库如nlohmann/json来解析JSON + + // 假设解析后得到ip和port + // ConnectToGateway(ip, port); + + delete[] content; + } + } + } + + // 发送HTTP响应 + std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n"; + send(client_socket, response.c_str(), response.size(), 0); + close(client_socket); +} + +// 启动HTTP服务器的函数 +void StartHttpServer() { + int http_server_socket = socket(AF_INET, SOCK_STREAM, 0); + if (http_server_socket < 0) { + perror("Could not create HTTP server socket"); + return; + } + + int opt = 1; + if (setsockopt(http_server_socket, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { + perror("Setsockopt failed"); + close(http_server_socket); + return; + } + + struct sockaddr_in server_addr; + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = INADDR_ANY; + server_addr.sin_port = htons(HTTP_SERVER_PORT); + + if (bind(http_server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { + perror("Bind failed"); + close(http_server_socket); + return; + } + + if (listen(http_server_socket, 5) < 0) { + perror("Listen failed"); + close(http_server_socket); + return; + } + + std::cout << "HTTP server listening on port " << HTTP_SERVER_PORT << std::endl; + + while (!exit_flag) { + int client_socket = accept(http_server_socket, NULL, NULL); + if (client_socket < 0) { + perror("Accept failed"); + continue; + } + + threads.emplace_back(HandleHttpRequest, client_socket); + } + + close(http_server_socket); +} + +int main() { + // threads.emplace_back(StartHttpServer); + + // std::string command, ip; + // int port; + // bool in_connect_mode = false; + // std::cout << "Enter command (connect/exit): "; + // while (true) { + + // if (in_connect_mode) + // { + // std::cout << "continue connect or not ? (y or n) "; + // std::cin >> command; + // if(command=="y"){ + // std::cout << "Enter the gateway IP address: "; + // std::cin >> ip; + // std::cout << "Enter the gateway port: "; + // std::cin >> port; + // ConnectToGateway(ip, port); + // } + // else { + // in_connect_mode = false; // 退出连接模式 + // std::cout << "Exiting connect mode." << std::endl; + // } + // } + // else{ + // std::cout << "Enter command (connect/exit): "; + // std::cin>>command; + // if (command == "connect") { + // if (in_connect_mode) { + // std::cout << "Already in connect mode." << std::endl; + // continue; + // } + // in_connect_mode = true; // 进入连接模式 + // std::cout << "Enter the gateway IP address: "; + // std::cin >> ip; + // std::cout << "Enter the gateway port: "; + // std::cin >> port; + // ConnectToGateway(ip, port); + // } else if (command == "exit") { + // exit_flag = true; // 设置退出标志 + // std::cout << "Exiting program." << std::endl; + // // 关闭所有套接字 + // for (auto& sock_pair : sockets) { + // shutdown(sock_pair.first, SHUT_RDWR); // 关闭套接字的发送和接收 + // close(sock_pair.first); + // } + // sockets.clear(); + // std::cout << "sockets.clear" << std::endl; + // // 等待所有线程结束 + // for (auto& thread : threads) { + // if (thread.joinable()) { + // thread.join(); + // } + // } + // threads.clear(); + // break; // 退出主循环 + // } else { + // std::cout << "Unknown command" << std::endl; + // } + // } + // } + // std::cout<<"out"<> command; + + if (command == "connect") { + if (in_connect_mode) { + std::cout << "Already in connect mode." << std::endl; + continue; + } + in_connect_mode = true; + std::cout << "Enter the gateway IP address: "; + std::cin >> ip; + std::cout << "Enter the gateway port: "; + std::cin >> port; + ConnectToGateway(ip, port); + } else if (command == "exit") { + break; // 接收到退出命令,退出主循环 + } else { + std::cout << "Unknown command" << std::endl; + } + } + + // 设置退出标志 + exit_flag = true; + + // 强制结束HTTP服务器线程 + if (http_server_thread.joinable()) { + http_server_thread.join(); + } + + // 关闭所有套接字 + for (auto& sock_pair : sockets) { + shutdown(sock_pair.first, SHUT_RDWR); + close(sock_pair.first); + } + sockets.clear(); + + // 等待所有工作线程结束 + for (auto& thread : threads) { + if (thread.joinable()) { + thread.join(); + } + } + threads.clear(); + + std::cout << "Exited program." << std::endl; + return 0; + +} \ No newline at end of file diff --git a/src/controller-v1.1/epollip/connector_database.cpp b/src/controller-v1.1/epollip/connector_database.cpp new file mode 100644 index 0000000..d0768cc --- /dev/null +++ b/src/controller-v1.1/epollip/connector_database.cpp @@ -0,0 +1,31 @@ +#include +#include + +int main() { + MYSQL *conn; + conn = mysql_init(NULL); + + if (conn == NULL) { + std::cerr << "MySQL init failed" << std::endl; + return 1; + } + + const char *server = "localhost"; + const char *user = "rtsw"; + const char *password = "123456"; + const char *database = "nginxdb"; + unsigned int port = 3306; // 使用云数据库提供的端口 + + if (mysql_real_connect(conn, server, user, password, database, port, NULL, 0) == NULL) { + std::cerr << "Connection error: " << mysql_error(conn) << std::endl; + mysql_close(conn); + return 1; + } + + std::cout << "Successfully connected to the database" << std::endl; + + // ... 执行数据库操作 ... + + mysql_close(conn); + return 0; +} \ No newline at end of file diff --git a/src/controller-v1.1/epollip/connector_gateway.cpp b/src/controller-v1.1/epollip/connector_gateway.cpp new file mode 100644 index 0000000..b6ba4d7 --- /dev/null +++ b/src/controller-v1.1/epollip/connector_gateway.cpp @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include +#include +#include + +#define PORT 8080 +#define MAX_CLIENTS 5 +#define BUFFER_SIZE 1024 + +// 声明 handle_client 函数 +void handle_client(int client_socket); + +int main() { + int server_fd, new_socket; + struct sockaddr_in server_addr, client_addr; + socklen_t client_len = sizeof(client_addr); + char buffer[BUFFER_SIZE]; + int opt = 1; + + // 创建套接字 + server_fd = socket(AF_INET, SOCK_STREAM, 0); + if (server_fd < 0) { + perror("socket creation failed"); + exit(EXIT_FAILURE); + } + + // 设置选项,允许重用地址 + if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { + perror("setsockopt failed"); + exit(EXIT_FAILURE); + } + + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = INADDR_ANY; + server_addr.sin_port = htons(PORT); + + // 绑定 + if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { + perror("bind failed"); + exit(EXIT_FAILURE); + } + + // 监听 + if (listen(server_fd, MAX_CLIENTS) < 0) { + perror("listen failed"); + exit(EXIT_FAILURE); + } + + std::cout << "Server listening on port " << PORT << std::endl; + + while (true) { + client_len = sizeof(client_addr); + new_socket = accept(server_fd, (struct sockaddr *)&client_addr, &client_len); + if (new_socket < 0) { + perror("accept failed"); + exit(EXIT_FAILURE); + } + + std::cout << "New client connected from " << inet_ntoa(client_addr.sin_addr) << " port " << ntohs(client_addr.sin_port) << std::endl; + + // 创建并启动线程处理客户端 + std::thread(handle_client, new_socket).detach(); + } + + close(server_fd); + return 0; +} + +// 定义 handle_client 函数 +void handle_client(int client_socket) { + while (true) { + char buffer[BUFFER_SIZE]; + memset(buffer, 0, BUFFER_SIZE); // 清空缓冲区 + int nbytes = read(client_socket, buffer, BUFFER_SIZE); + if (nbytes <= 0) { + std::cout << "Client disconnected." << std::endl; + close(client_socket); + break; + } + std::cout << "Received message from client: " << buffer << std::endl; + // 这里可以添加更多的处理逻辑 + } +} \ No newline at end of file diff --git a/src/controller-v1.1/epollip/db_processer/basic_db.cpp b/src/controller-v1.1/epollip/db_processer/basic_db.cpp new file mode 100644 index 0000000..0abc9ed --- /dev/null +++ b/src/controller-v1.1/epollip/db_processer/basic_db.cpp @@ -0,0 +1,66 @@ +#include +#include + +int main() { + MYSQL *conn; + conn = mysql_init(NULL); + + if (conn == NULL) { + std::cerr << "MySQL init failed" << std::endl; + return 1; + } + + const char *server = "localhost"; + const char *user = "rtsw"; + const char *password = "123456"; + const char *database = "nginxdb"; + unsigned int port = 3306; + + if (mysql_real_connect(conn, server, user, password, database, port, NULL, 0) == NULL) { + std::cerr << "Connection error: " << mysql_error(conn) << std::endl; + mysql_close(conn); + return 1; + } + + std::cout << "Successfully connected to the database" << std::endl; + + // 插入数据 + const char *insert_query = "INSERT INTO users (username, email) VALUES ('newuser', 'newuser@example.com')"; + if (mysql_query(conn, insert_query)) { + std::cerr << "Insert error: " << mysql_error(conn) << std::endl; + } else { + std::cout << "Insert successful" << std::endl; + } + + // 查询数据 + const char *select_query = "SELECT * FROM users"; + MYSQL_RES *result = mysql_store_result(conn); + if (result) { + MYSQL_ROW row; + while ((row = mysql_fetch_row(result))) { + std::cout << "id: " << row[0] << ", username: " << row[1] << ", email: " << row[2] << std::endl; + } + mysql_free_result(result); + } else { + std::cerr << "Select error: " << mysql_error(conn) << std::endl; + } + + // 更新数据 + const char *update_query = "UPDATE users SET email = 'newuser_updated@example.com' WHERE username = 'newuser'"; + if (mysql_query(conn, update_query)) { + std::cerr << "Update error: " << mysql_error(conn) << std::endl; + } else { + std::cout << "Update successful" << std::endl; + } + + // 删除数据 + const char *delete_query = "DELETE FROM users WHERE username = 'newuser'"; + if (mysql_query(conn, delete_query)) { + std::cerr << "Delete error: " << mysql_error(conn) << std::endl; + } else { + std::cout << "Delete successful" << std::endl; + } + + mysql_close(conn); + return 0; +} \ No newline at end of file diff --git a/src/controller-v1.1/epollip/myapp b/src/controller-v1.1/epollip/myapp new file mode 100644 index 0000000000000000000000000000000000000000..35a074f540d5007b73f9f414d31aeb48e16bdcc4 GIT binary patch literal 16816 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 r@3z=~zW(6*3-( +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BUFFER_SIZE 1024 + +std::vector threads; // 存储所有连接线程 +std::map sockets; // 存储套接字 +std::mutex sockets_mutex; // 用于同步访问 sockets +std::atomic exit_flag(false); // 原子退出标志 + + +// 维护连接的函数 +void KeepConnection(int sock) { + char buffer[BUFFER_SIZE]; + int nbytes; + while (!exit_flag) { + nbytes = recv(sock, buffer, BUFFER_SIZE, 0); + if (nbytes <= 0) { + std::cout << "Gateway disconnected" << std::endl; + break; + } + std::cout << "Received from gateway (Socket " << sock << "): " << buffer << std::endl; + } + + { + std::lock_guard lock(sockets_mutex); + sockets.erase(sock); // 从集合中移除套接字 + } + close(sock); +} +// 连接到网关的函数 +void ConnectToGateway(const std::string& ip, int port) { + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + perror("Could not create socket"); + return; + } + + struct sockaddr_in server_addr; + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(port); + if (inet_pton(AF_INET, ip.c_str(), &server_addr.sin_addr) <= 0) { + perror("Invalid address"); + close(sock); + return; + } + + if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { + perror("Connection to the server failed"); + close(sock); + return; + } + + { + std::lock_guard lock(sockets_mutex); + sockets[sock] = 1; // 将套接字添加到集合中 + } + + std::cout << "Connected to gateway at " << ip << ":" << port << " (Socket " << sock << ")" << std::endl; + + // 在新线程中维护连接 + threads.emplace_back(KeepConnection, sock); +} + + + +int main() { + std::string command, ip; + int port; + bool in_connect_mode = false; + + while (true) { + std::cout << "Enter command (connect/exitconnect/exit): "; + std::cin >> command; + + if (command == "connect") { + if (in_connect_mode) { + std::cout << "Already in connect mode." << std::endl; + continue; + } + in_connect_mode = true; // 进入连接模式 + std::cout << "Enter the gateway IP address: "; + std::cin >> ip; + std::cout << "Enter the gateway port: "; + std::cin >> port; + ConnectToGateway(ip, port); + } else if (command == "exitconnect") { + if (!in_connect_mode) { + std::cout << "Not in connect mode." << std::endl; + continue; + } + in_connect_mode = false; // 退出连接模式 + std::cout << "Exiting connect mode." << std::endl; + } else if (command == "exit") { + exit_flag = true; // 设置退出标志 + std::cout << "Exiting program." << std::endl; + // 关闭所有套接字 + for (auto& sock_pair : sockets) { + shutdown(sock_pair.first, SHUT_RDWR); // 关闭套接字的发送和接收 + close(sock_pair.first); + } + sockets.clear(); + // 等待所有线程结束 + for (auto& thread : threads) { + if (thread.joinable()) { + thread.join(); + } + } + threads.clear(); + break; // 退出主循环 + } else { + std::cout << "Unknown command" << std::endl; + } + } + + return 0; +} \ No newline at end of file diff --git a/src/controller-v1.1/epollip/newclient b/src/controller-v1.1/epollip/newclient new file mode 100644 index 0000000000000000000000000000000000000000..e3012e8e0def5fde246699623aa56a424483c0d2 GIT binary patch literal 74640 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 PjFNDg7E}s&lGgtLVDnYM literal 0 HcmV?d00001 diff --git a/src/controller-v1.1/epollip/server b/src/controller-v1.1/epollip/server new file mode 100644 index 0000000000000000000000000000000000000000..8e6ce96d3e4358212349c3a1026a529650410d4e GIT binary patch literal 33080 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 V$7NkQUCY^@woGZv@EQ16@n0<~4Ilsj literal 0 HcmV?d00001 -- 2.34.1