Я пишу простой сервер для своего класса сетей, и у меня возникают проблемы с правильной передачей данных клиенту (предоставлен проф).
После того, как я прошел все настройки и установил соединение, я начинаю читать фрагменты файла и записывать их в сокет, проверяя, совпадают ли возвращаемые функции чтения и записи. Я также сохраняю итоговое количество прочитанных / записанных байтов и сравниваю их с общим размером файла (через stat.st_size
), и все они совпадают.
Независимо от того, сколько раз я запрашиваю один и тот же файл, журнал на стороне сервера всегда имеет правильные метрики. Клиент время от времени теряет конец файла. Разница между фактическим и ожидаемым размером почти никогда не бывает одинаковой от одного вызова к другому, и кажется, что он всегда является концом отсутствующего файла, без каких-либо частей с середины. Размер поступившего файла также кратен 512 (размер чанка).
Итак, кажется, что некоторые целые куски делают это, а затем остальные как-то теряются.
#define CHUNK_SIZE 512
/* other definitions */
int main()
{
/* basic server setup: socket(), bind(), listen() ...
variable declarations and other setup */
while(1)
{
int cliSock = accept(srvSock, NULL, NULL);
if(cliSock < 0)
; /* handle error */
read(cliSock, filename, FILE_NAME_SIZE - 1);
int reqFile = open(filename, O_RDONLY);
if( reqFile == -1)
; /* handle error */
struct stat fileStat;
fstat(reqFile, &fileStat);
int fileSize = fileStat.st_size;
int bytesRead, totalBytesRead = 0;
char chunk[CHUNK_SIZE];
while((bytesRead = read(reqFile, chunk, CHUNK_SIZE)) > 0)
{
totalBytesRead += byteasRead;
if(write(cliSock, chunk, bytesRead) != bytesRead)
{
/* perror(...) */
/* print an error to the log file */
bytesRead = -1;
break;
}
}
if (bytesRead == -1)
{
/* perror(...) */
/* print an error to the log file */
close(cliSock);
continue;
}
/* more code to write transfer metrics etc to the log file */
}
}
Весь удаленный код обработки ошибок является некоторой разновидностью печати сообщения об ошибке в файл журнала и возврата к началу цикла.
Редактировать перевернул <
, который должен был быть >