rmdsagar Ответов: 1

Как начать чтение текста в файле с определенного байта в MFC


Я разработал сервер и клиент в MFC, который выполняет передачу файлов один раз после установления соединения. Например, я отправляю файл с 200 символами с сервера на клиент, но размер буфера в функции приема клиента составляет всего 100(char buf[100]). если это так, то я посылаю команду серверу отправить оставшиеся данные. Как начать отправку со 101-го символа?

Что я уже пробовал:

Сервер :
CFile Sourcefile;
Sourcefile.Open(strFilePath, CFile::modeRead);
ULONGLONG dwLength = Sourcefile.GetLength();
command_header.Databuffer = new char[(int)dwLength + 1];
UINT nActual = Sourcefile.Read(command_header.Databuffer,dwLength);
command_header.Databuffer[nActual] = 0;
nRet = SockConnection.Send(command_header.Databuffer, nActual);


Клиент :
nRet = SockConnection.Receive(iBuf, 100);
while(iBuf[nRet] != '\0') {
AfxMessageBox(L"Send remaining data");
hCommand_header.command = FILE_SIZE;
nRet = SockConnection.Send((char*)&hCommand_header.command, sizeof(hCommand_header.command));

1 Ответов

Рейтинг:
7

Richard MacCutchan

Сервер отправляет все данные в одной передаче, поэтому для него больше нет работы. Клиент должен построить файл, записывая каждый блок на диск по мере его получения. Единственная проблема для вас заключается в том, что клиент не может знать, когда все данные были получены. Вам нужно создать протокол обмена сообщениями между двумя системами, чтобы они могли передавать информацию об объеме передаваемых данных.


rmdsagar

Спасибо! Вы бы предпочли контрольную сумму? если это так, то я пытаюсь использовать ShellExecute() для вычисления контрольной суммы переданного файла.
Функцией shellexecute(null, то я"Запуск от имени" я"cmd.exe",
L"cksum C:\\cplic.log",
NULL, SW_SHOWNORMAL);


очевидно, это не сработало. Пожалуйста, пролейте немного света на то, как просто рассчитать контрольную сумму. Спасибо

Richard MacCutchan

Для начала не используйте ShellExecute, добавьте немного кода в свою программу. Контрольная сумма используется только после того, как все данные были переданы, чтобы проверить, что ничего не потеряно или повреждено. Но это не поможет вам узнать, сколько сообщений было потеряно. Начните с отправки некоторой информации о файле и о том, сколько данных будет передано. Затем вы можете добавить префикс к каждому блоку, который указывает, сколько байтов он содержит и является ли он последним блоком в наборе. Никогда не думайте, что все, что вы получаете, - это все, что было послано.

rmdsagar

Хорошо! как-то так получилось:
Контрольная сумма HINSTANCE = ShellExecute(NULL, L"runas", L"cmd.exe",
L"/k cksum C:\\cplic.log",
NULL, SW_SHOWNORMAL);
Теперь я получаю значение контрольной суммы файла журнала как "3009825132".
Это правильно?