void handleClient(char *buffer, int sock, int msgSize, struct sockaddr_in addr) { Packet *recvPacket = Packet::deserialize(buffer); //Clear the buffer because we no longer need it. memset(buffer, 0, strlen(buffer)); char *action = recvPacket->getAction(); if (strcmp(action, UPDATE) == 0) { printf("Got UPDATE\n"); // TODO: Implement data table logic char* Files = recvPacket->getMessage(); bool updated = false; for(auto iter = ClientInfo::getClients().begin(); iter != ClientInfo::getClients().end(); iter++) { if (strcmp(recvPacket->getHostName(), iter->getHostName()) == 0 && strcmp(recvPacket->getIpAddress(), iter->getIpAddress()) == 0) { iter->formatFilesList(Files); updated = true; break; } } if (!updated) { ClientInfo *clientInfo = new ClientInfo::ClientInfo(recvPacket->getHostName(), recvPacket->getIpAddress()); clientInfo->formatFilesList(Files); ClientInfo::addClient(clientInfo); } Packet *sendPacket = new Packet::Packet(ACK, ACK); if (sendto(sock, sendPacket->serialize(), strlen(sendPacket->serialize()), 0, (struct sockaddr *) &addr, sizeof(addr)) != strlen(sendPacket->serialize())) exitWithError("sendto() sent a different number of bytes than expected"); } else if (strcmp(action, QUERY) == 0) { printf("Got QUERY\n"); // TODO: Implement logic to find all clients with requested file(s) std::vector<std::string> filesVector = split(recvPacket->getMessage(), '\n'); std::string packetMessage = ""; for(auto iter = filesVector.begin(); iter != filesVector.end(); iter++) { // Search through every client looking for the file packetMessage = packetMessage + ClientInfo::getClientsByFileName(*iter); } std::cout << "Message: " << packetMessage << std::endl; Packet *sendPacket = new Packet::Packet(QUERYRESULT, packetMessage.c_str()); if (sendto(sock, sendPacket->serialize(), strlen(sendPacket->serialize()), 0, (struct sockaddr *) &addr, sizeof(addr)) != strlen(sendPacket->serialize())) exitWithError("sendto() sent a different number of bytes than expected"); } else if (strcmp(action, EXIT) == 0) { printf("Got EXIT\n"); // TODO: Handle client wanting to exit and delete it from data table char* exitingHost = recvPacket->getHostName(); char* exitingIP = recvPacket->getIpAddress(); ClientInfo::removeClient(exitingHost, exitingIP); Packet *sendPacket = new Packet::Packet(ACK, "Client has been disconnected"); if (sendto(sock, sendPacket->serialize(), strlen(sendPacket->serialize()), 0, (struct sockaddr *) &addr, sizeof(addr)) != strlen(sendPacket->serialize())) exitWithError("sendto() sent a different number of bytes than expected"); } else { /* Send received datagram back to the client */ // TODO: If a non-valid action is recieved, should the packet be ignored? printf("%s\n", "Client sent invalid action. Ignoring..."); } }