1/* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15#include <iostream> 16#include <sstream> 17#include <cstring> 18#include <arpa/inet.h> 19#include <unistd.h> 20#include <sys/socket.h> 21#include "include/client_control.h" 22#include "include/sp_utils.h" 23#include "include/startup_delay.h" 24#include "include/sp_log.h" 25#include "include/common.h" 26namespace OHOS { 27namespace SmartPerf { 28int ClientControl::SocketStart(const std::string &args) 29{ 30 std::string messageInit = message + args; 31 int resultId = OHOS::SmartPerf::ClientControl::InitSocket(); 32 if (resultId == 1) { 33 LOGE("ClientControl::InitSocket() error(%d)", resultId); 34 return resultId; 35 } 36 send(clientSocket, messageInit.c_str(), strlen(messageInit.c_str()), 0); 37 read(clientSocket, buffer, numBuff); 38 send(clientSocket, message1, strlen(message1), 0); 39 read(clientSocket, buffer, numBuff); 40 char dest[arraySize] = {0}; 41 size_t i; 42 for (i = 0; buffer[i] != '\0' && i < arraySize - 1; i++) { 43 dest[i] = buffer[i]; 44 } 45 dest[i] = '\0'; 46 if (strcmp(dest, "start::True") == 0) { 47 std::cout << "SP_daemon Collection begins" << std::endl; 48 OHOS::SmartPerf::ClientControl::CloseSocket(); 49 } else { 50 std::cout << "SP_daemon Collection begins failed" << std::endl; 51 OHOS::SmartPerf::StartUpDelay sd; 52 sd.GetSpClear(); 53 } 54 LOGI("ClientControl::SocketStart() OK"); 55 return 0; 56} 57int ClientControl::SocketStop() 58{ 59 OHOS::SmartPerf::ClientControl::InitSocket(); 60 send(clientSocket, message2, strlen(message2), 0); 61 read(clientSocket, buffer, numBuff); 62 char dest[arraySize] = {0}; 63 size_t i; 64 for (i = 0; buffer[i] != '\0' && i < arraySize - 1; i++) { 65 dest[i] = buffer[i]; 66 } 67 dest[i] = '\0'; 68 if (strcmp(dest, "stop::True") == 0) { 69 std::cout << "SP_daemon Collection ended" << std::endl; 70 std::cout << "Output Path: data/local/tmp/smartperf/1/t_index_info.csv" << std::endl; 71 OHOS::SmartPerf::StartUpDelay sd; 72 OHOS::SmartPerf::ClientControl::CloseSocket(); 73 sd.GetSpClear(); 74 } else { 75 std::cout << "SP_daemon Collection ended failed" << std::endl; 76 } 77 LOGI("ClientControl::SocketStop() OK"); 78 return 0; 79} 80int ClientControl::InitSocket() 81{ 82 clientSocket = socket(AF_INET, SOCK_STREAM, 0); 83 if (clientSocket == -1) { 84 LOGE("Faild to create socket"); 85 return -1; 86 } 87 serverAddress.sin_family = AF_INET; 88 serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); 89 serverAddress.sin_port = htons(protNumber); 90 if (connect(clientSocket, reinterpret_cast<struct sockaddr *>(&serverAddress), sizeof(serverAddress)) < 0) { 91 OHOS::SmartPerf::StartUpDelay sd; 92 sd.GetSpClear(); 93 LOGE("Failed to connect to server"); 94 return 1; 95 } 96 LOGI("ClientControl::InitSocket() OK"); 97 return 0; 98} 99void ClientControl::StartSPDaemon() const 100{ 101 std::string result = ""; 102 std::string server = CMD_COMMAND_MAP.at(CmdCommand::SERVER); 103 SPUtils::LoadCmd(server, result); 104 sleep(1); 105 LOGI("ClientControl::StartSPDaemon() OK"); 106} 107int ClientControl::CloseSocket() 108{ 109 shutdown(clientSocket, SHUT_RD); 110 close(clientSocket); 111 clientSocket = -1; 112 LOGI("ClientControl::CloseSocket() OK"); 113 return 0; 114} 115} 116}