A1exSun
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Abs62 Тогда как проверять, что оба буферы заняты? (bufi[0] > C.PackSize) && (bufi[1] > C.PackSize) ? Исправил: Код: void ReceiveFile(void) { FILE *f; unsigned long i, q; int handle; Header("ПРИЙОМ ФАЙЛУ"); cprintf(" Очiкування iнформацiї про файл..."); while (bufi[n] < 27) { if (kbhit()) if (getch() == 27) return; if (CheckErrors()) { getch(); return; } } memcpy(hello.data,buffer[n],27); bufi[n] = 0; cprintf("\r\n Iм'я файлу: %s\r\n",hello.info.fname); cprintf(" Розмiр файлу: "); ShowSize(hello.info.fsize); cprintf(" Дата редагування: %02u.%02u.%02u, %02u:%02u\r\n",hello.info.ft.ft_day,hello.info.ft.ft_month,hello.info.ft.ft_year+1980,hello.info.ft.ft_hour,hello.info.ft.ft_min); cprintf(" CRC32: %08lx\r\n",hello.info.crc); cprintf(" Розмiр пакету: "); ShowSize(hello.info.isize); f = fopen(hello.info.fname,"wb"); if (f) { q = hello.info.fsize / C.PackSize; for (i = 0; i < q; i++) { while (bufi[n^1] < C.PackSize) if (CheckErrors()) { getch(); return; } fwrite(buffer[n^1],C.PackSize,1,f); bufi[n^1] = 0; } q = hello.info.fsize % C.PackSize; while (bufi[n] < q) CheckErrors(); fwrite(buffer[n],q,1,f); bufi[n] -= q; handle = fileno(f); setftime(handle,&hello.info.ft); fclose(f); cprintf(" \r\n Файл прийнятий."); } else { cprintf("Не вдалось створити файл."); } getch(); } | Теперь виснет, на выходе пустой файл. Добавлено: Цитата: Так можно делать, если передатчик, отправив структуру, ждёт подтверждения на передачу тела файла. Если же он начинает отправлять данные сразу, так можно и полезную информацию затереть. Те байты, которые уже успели прийти после структуры. | Дописал sleep(1) после передачи структуры - сойдет? |