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...");
    }
}