Отправить целое число из TCP-сокета в C в Qt TCP-сокет - PullRequest
0 голосов
/ 30 ноября 2018

В настоящее время я пытаюсь реализовать базовую программу передачи файлов клиент-сервер с использованием сокетов TCP.Клиент написан на C ++ / Qt, а сервер на C. Я столкнулся с большими трудностями при попытке отправить размер файла с сервера на клиент (целочисленное значение).Ниже приведены примеры кода.

C-сервер:

if(fileExists == '1')
{
   fp = fopen(filename, "r");
   fseek(fp, 0L, SEEK_END);
   fileSize = ftell(fp);
   printf("%d\n", fileSize);
   send(client_socket, &fileSize, sizeof(fileSize), 0);
}

Qt Client:

void Client::receiveFile(QString filename)
{
    qint32 fileSize;
    clientSocket->waitForReadyRead(1000);
    clientSocket->read(fileSize);
    qDebug() << fileSize;
}

Проблема в том, что C правильно вычисляет размер файла как 40435408 и отправляетэто клиенту, который говорит, что размер 32767. Очевидно, что проблема лежит на стороне клиента.Я пытался выяснить проблему почти весь день и не смог.Я понимаю, что это какая-то простая и глупая ошибка, которую я совершил, и я прошу прощения за такой глупый вопрос.Я полный новичок.Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 30 ноября 2018

Когда вы звоните clientSocket->read(fileSize);, вы на самом деле звоните QByteArray QIODevice::read(qint64 maxSize).Это означает, что вы читаете до undefined (поскольку fileSize не инициализировано) количество байтов из сокета TCP и немедленно его отбрасываете, поскольку вы не используете возвращаемое значение.

Я думаювы пытаетесь использовать qint64 QIODevice::read(char *data, qint64 maxSize), поэтому ваш код должен выглядеть следующим образом:

qint32 fileSize = 0;
clientSocket->waitForReadyRead(1000);
if (clientSocket->bytesAvailable() >= sizeof(fileSize)) {
    clientSocket->read(&fileSize, sizeof(fileSize));
} else {
    qWarning() < "Only received" << clientSocket->bytesAvailable() << "bytes: " << clientSocket->readAll().toHex(' ');
}
qDebug() << fileSize;

Обратите внимание, что я не буду использовать этот код в любом программном обеспечении, которое является более чем доказательством концепции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...