void TcpServer::listen() { serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == -1) { logError("Could not create socket"); return; } if (bind(serverSocket, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) { logError("Could not bind socket"); return; } ::listen(serverSocket, 1); logDebug("Waiting for incoming connections..."); serverInstance = this; int clientSocket; struct sockaddr_in client; int c = sizeof(client); while ((clientSocket = accept(serverSocket, (struct sockaddr *) &client, (socklen_t*) &c))) { const char* message = MessageConversion::getHandshakeInitiation(); bool connectionRefused = false; StatusResponse response(false, nullptr); if (numCurrentConnections < maxConnections && sendMessage(clientSocket, message)) { char* receivedMessage = receiveMessage(clientSocket); if (receivedMessage != nullptr) { if (MessageConversion::isHandshakeCorrect(receivedMessage)) { logDebug("Connection accepted"); response.setSuccess(true); message = MessageConversion::convertResponseToJson( &response); if (sendMessage(clientSocket, message)) { TcpConnection* connection = new TcpConnection( clientSocket, this, spotifyRunner); connection->start(); this->currentConnections.push_back(connection); numCurrentConnections++; } delete[] message; } else { response.setMessage("Handshake incorrect."); message = MessageConversion::convertResponseToJson( &response); sendMessage(clientSocket, message); delete[] message; connectionRefused = true; } delete[] receivedMessage; } else { response.setMessage("Error during receiving of message"); message = MessageConversion::convertResponseToJson(&response); sendMessage(clientSocket, message); delete[] message; connectionRefused = true; } } else { response.setMessage("Too many connections"); message = MessageConversion::convertResponseToJson(&response); sendMessage(clientSocket, message); delete[] message; connectionRefused = true; } if (connectionRefused) { logDebug("Connection refused"); shutdown(clientSocket, SHUT_RDWR); } } shutdown(serverSocket, SHUT_RDWR); }