pull/19/head
			
			
		
		
							parent
							
								
									ea52d2645b
								
							
						
					
					
						commit
						a046af40dc
					
				| @ -0,0 +1,31 @@ | |||||||
|  | #include <iostream> | ||||||
|  | #include <mysql/mysql.h> | ||||||
|  | 
 | ||||||
|  | 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; | ||||||
|  | } | ||||||
| @ -0,0 +1,86 @@ | |||||||
|  | #include <iostream> | ||||||
|  | #include <thread> | ||||||
|  | #include <cstring> | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | 
 | ||||||
|  | #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; | ||||||
|  |         // 这里可以添加更多的处理逻辑
 | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,66 @@ | |||||||
|  | #include <iostream> | ||||||
|  | #include <mysql/mysql.h> | ||||||
|  | 
 | ||||||
|  | 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; | ||||||
|  | } | ||||||
| @ -0,0 +1,22 @@ | |||||||
|  | #ifndef CONNECTOR_CONTROLLER_H | ||||||
|  | #define CONNECTOR_CONTROLLER_H | ||||||
|  | 
 | ||||||
|  | #include <iostream> | ||||||
|  | #include <thread> | ||||||
|  | #include <vector> | ||||||
|  | #include <map> | ||||||
|  | #include <mutex> | ||||||
|  | #include <atomic> | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | #include <cstring> | ||||||
|  | 
 | ||||||
|  | // 函数声明
 | ||||||
|  | void StartHttpServer(); | ||||||
|  | void ConnectToGateway(const std::string& ip, int port); | ||||||
|  | void KeepConnection(int sock); | ||||||
|  | void HandleHttpRequest(int client_socket); | ||||||
|  | 
 | ||||||
|  | #endif // CONNECTOR_CONTROLLER_H
 | ||||||
| @ -0,0 +1,10 @@ | |||||||
|  | #ifndef CONNECTOR_DATABASE_H | ||||||
|  | #define CONNECTOR_DATABASE_H | ||||||
|  | 
 | ||||||
|  | #include <iostream> | ||||||
|  | #include <mysql/mysql.h> | ||||||
|  | 
 | ||||||
|  | // 函数声明
 | ||||||
|  | void DatabaseOperation(); | ||||||
|  | 
 | ||||||
|  | #endif // CONNECTOR_DATABASE_H
 | ||||||
| @ -0,0 +1,35 @@ | |||||||
|  | #include <iostream> | ||||||
|  | #include <string> | ||||||
|  | #include "connector_controller.h" | ||||||
|  | #include "connector_database.h" | ||||||
|  | 
 | ||||||
|  | int main() { | ||||||
|  |     std::string command; | ||||||
|  |     bool running = true; | ||||||
|  | 
 | ||||||
|  |     while (running) { | ||||||
|  |         std::cout << "Enter command (start_http_server/connect_gateway/database_operation/exit): "; | ||||||
|  |         std::cin >> command; | ||||||
|  | 
 | ||||||
|  |         if (command == "start_http_server") { | ||||||
|  |             StartHttpServer(); | ||||||
|  |         } else if (command == "connect_gateway") { | ||||||
|  |             std::string ip; | ||||||
|  |             int port; | ||||||
|  |             std::cout << "Enter the gateway IP address: "<<std::endl; | ||||||
|  |             std::cin>>ip; // 使用getline以获取包含空格的IP地址
 | ||||||
|  |             std::cout << "Enter the gateway port: "<<std::endl; | ||||||
|  |             std::cin >> port; | ||||||
|  |             ConnectToGateway(ip, port); | ||||||
|  |         } else if (command == "database_operation") { | ||||||
|  |             DatabaseOperation(); | ||||||
|  |         } else if (command == "exit") { | ||||||
|  |             running = false; | ||||||
|  |         } else { | ||||||
|  |             std::cout << "Unknown command" << std::endl; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     std::cout << "Exiting program." << std::endl; | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
											
												Binary file not shown.
											
										
									
								| @ -0,0 +1,125 @@ | |||||||
|  | #include <iostream> | ||||||
|  | #include <thread> | ||||||
|  | #include <vector> | ||||||
|  | #include <map> | ||||||
|  | #include <mutex> | ||||||
|  | #include <atomic> | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | 
 | ||||||
|  | #define BUFFER_SIZE 1024 | ||||||
|  | 
 | ||||||
|  | std::vector<std::thread> threads; // 存储所有连接线程
 | ||||||
|  | std::map<int, int> sockets; // 存储套接字
 | ||||||
|  | std::mutex sockets_mutex; // 用于同步访问 sockets
 | ||||||
|  | std::atomic<bool> 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<std::mutex> 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<std::mutex> 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; | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in new issue