diff --git a/src/controller_ubuntu/connecter_controler.cpp b/src/controller_ubuntu/connecter_controler.cpp index 39496fd..7d1a2f9 100644 --- a/src/controller_ubuntu/connecter_controler.cpp +++ b/src/controller_ubuntu/connecter_controler.cpp @@ -1,6 +1,8 @@ #include -#include #include +#include +#include +#include #include #include #include @@ -8,65 +10,106 @@ #define BUFFER_SIZE 1024 -void connect_to_gateway(const std::string& ip, int port) { +std::vector threads; // 存储所有连接线程 +std::map sockets; // 存储套接字 +std::mutex sockets_mutex; // 用于同步访问 sockets + +// 维护连接的函数 +void KeepConnection(int sock) { + char buffer[BUFFER_SIZE]; + int nbytes; + while (true) { + 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 == -1) { - std::cerr << "Could not create socket" << std::endl; + 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_aton(ip.c_str(), &server_addr.sin_addr) == 0) { - std::cerr << "Invalid IP address" << std::endl; + 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) { - std::cerr << "Connection to the server failed" << std::endl; + perror("Connection to the server failed"); close(sock); return; } - std::cout << "Connected to gateway at " << ip << ":" << port << std::endl; - - char buffer[BUFFER_SIZE]; - // 发送测试消息 - std::string message = "Hello, Gateway!"; - if (send(sock, message.c_str(), message.size(), 0) < 0) { - std::cerr << "Send failed" << std::endl; - close(sock); - return; + { + std::lock_guard lock(sockets_mutex); + sockets[sock] = 1; // 将套接字添加到集合中 } - // 接收网关响应 - int nbytes = recv(sock, buffer, BUFFER_SIZE, 0); - if (nbytes < 0) { - std::cerr << "Recv failed" << std::endl; - } else if (nbytes == 0) { - std::cout << "Gateway disconnected" << std::endl; - } else { - std::cout << "Gateway said: " << buffer << std::endl; - } + std::cout << "Connected to gateway at " << ip << ":" << port << " (Socket " << sock << ")" << std::endl; - close(sock); + // 在新线程中维护连接 + threads.emplace_back(KeepConnection, sock); } + int main() { - std::string ip; + std::string command, ip; int port; + bool connecting = false; + + while (true) { + std::cout << "Enter command (connect/exitconnect/exit): "; + std::cin >> command; - std::cout << "Enter the gateway IP address: "; - std::cin >> ip; - std::cout << "Enter the gateway port: "; - std::cin >> port; + if (command == "connect") { + connecting = 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") { + connecting = false; + std::cout << "Exiting connect mode." << std::endl; + } else if (command == "exit") { + if (connecting) { + // 等待所有连接线程结束 + for (auto& thread : threads) { + thread.join(); + } + // 清空线程向量 + threads.clear(); + } + std::cout << "Exiting program." << std::endl; + break; + } else { + std::cout << "Unknown command" << std::endl; + } + } - // 多线程连接网关 - std::thread client_thread(&connect_to_gateway, ip, port); - client_thread.join(); // 等待连接完成 + // 关闭所有套接字 + for (auto& sock_pair : sockets) { + close(sock_pair.first); + } + sockets.clear(); return 0; } \ No newline at end of file