void CNetRender::ReceiveData(QTcpSocket *socket, sMessage *msg) { QDataStream socketReadStream(socket); qint64 bytesAvailable = socket->bytesAvailable(); while(bytesAvailable > 0) { if (msg->command == netRender_NONE) { if (socket->bytesAvailable() < (qint64)((sizeof(msg->command) + sizeof(msg->id) + sizeof(msg->size)))) { return; } // meta data available socketReadStream >> msg->command; socketReadStream >> msg->id; socketReadStream >> msg->size; } bytesAvailable = socket->bytesAvailable(); if(msg->size > 0) { if (bytesAvailable < (qint64)(sizeof(quint16) + msg->size)) { return; } // full payload available char* buffer = new char[msg->size]; socketReadStream.readRawData(buffer, msg->size); msg->payload.append(buffer, msg->size); quint16 crcCalculated = qChecksum(buffer, msg->size); quint16 crcReceived; socketReadStream >> crcReceived; delete[] buffer; if(crcCalculated != crcReceived) { //ResetMessage(msg); //socketReadStream.atEnd(); //socketReadStream.skipRawData(socket->bytesAvailable()); return; } msg->size = msg->payload.size(); } ProcessData(socket, msg); bytesAvailable = socket->bytesAvailable(); } }
/* Helper function for child process. Parameter: socketFD - Socket file descriptor Parameter: newSocketFD - New socket file descriptor Parameter: buffer - Buffer string */ void childHelper(int socketFD, int newSocketFD, char buffer[]) { // Instantiate variables int temporaryResult; long plainTextSize; long keySize; // Close socket and flush buffer close(socketFD); bzero(buffer, sizeof(buffer)); // Display to client the server type and re-Flush socketWrite(newSocketFD, "enc_d"); bzero(buffer, sizeof(buffer)); // Fetch plainText size from client temporaryResult = read(newSocketFD, &plainTextSize, sizeof(plainTextSize)); if (temporaryResult < 0) { printf("Error - Socket Reading!\n"); } // Set plainText length and send ACK response long plainTextLength = ntohl(plainTextSize); socketWrite(newSocketFD, "ACK"); // Allocate memory for plainText, begin plainText socket read stream, and terminate char *plainText = malloc(sizeof(char) * (plainTextLength + 1)); long size = socketReadStream(newSocketFD, plainText, plainTextLength); plainText[size] = '\0'; // Send ACK response and flush buffer for client key socketWrite(newSocketFD, "ACK"); bzero(buffer, sizeof(buffer)); // Fetch client's key size temporaryResult = read(newSocketFD, &keySize, sizeof(keySize)); if (temporaryResult < 0) { printf("Error - Socket Reading!\n"); } // Set key length and send ACK response long keyLength = ntohl(keySize); socketWrite(newSocketFD, "ACK"); // Allocate memory for client key and start read stream char *key = malloc(sizeof(char) * (keyLength + 1)); size = socketReadStream(newSocketFD, key, keyLength); key[size] = '\0'; // Send ACK response, encrypt plainText with client key, and send result socketWrite(newSocketFD, "ACK"); char *cipherText = encrypt(key, plainText, strlen(plainText)); socketWrite(newSocketFD, cipherText); // Cleanup close(newSocketFD); free(plainText); free(key); free(cipherText); exit(0); }