예제 #1
0
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();
	}
}
예제 #2
0
/*
    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);
}