Передача файлов — Пакетные раунды

В основном я использую буфер размером 20 480 байт, который входит в структуру пакета. Вот структура:

struct PACKET
{
DWORD Header;
char data[20480];
bool eof;
};

То, что я делаю, это чтение файла 20 480 байт за раз и отправка его до тех пор, пока весь файл не будет отправлен. Я проверяю это на файле размером 3 МБ, и отправляется примерно 150 раундов.

Вот код:

PACKET sc;
sc.Header = 0xB;
ifstream file("test.pdf", ios::ate | ios::binary | ios::in);
DWORD fileSize = file.tellg();
file.seekg(0, ios::beg)

int counter = 20480;
int rounds = fileSize / 20480 + 1;

И цикл отправки:

while (rounds != 0)
{
sc.eof = false;

file.read(sc.data, sizeof(sc.data));

send(Slick.client, (char*)&sc, sizeof(sc), 0);

file.seekg(counter + 1);
counter = counter + 20480;

rounds--;
Sleep(1);

if (rounds == 0) sc.eof = true;

cout << "Left to send: " << rounds << endl;
}
file.close();
cout << "All data was sent!" << endl;

Я использую асинхронные сокеты на другой стороне, поэтому моя проблема в том, что иногда он получает 140 пакетов, иногда 130, 147, 148 и т. Д., И файл всегда поврежден. Что я делаю неправильно?


Вот другая сторона:

case PACKET_FILE:
{
if (isOpen == false)
{
isOpen = true;
file.open("tester.pdf", ios::binary | ios::out | ios::app);
file.write(pack.data, sizeof(pack.data));
}
else
{
if (pack.eof == true)
{

file.write(pack.data, sizeof(pack.data));
file.close();
MessageBox(NULL, "File Received", "LOL", MB_OK);
break;
}
file.write(pack.data, sizeof(pack.data));
}
countz++;
char bue[10];
itoa(countz, bue, 10);
SendMessage(hlabelPackets, WM_SETTEXT, NULL, (LPARAM)(bue));
break;
}

Пожалуйста, помогите, это не имеет смысла …

1

Решение

Похоже, проблема заключается в настройке сокета. Если вы используете UDP, у вас не будет гарантии доставки, и они не обязательно будут доставлены в том же порядке, в котором вы их отправили.

Кроме того, кажется, что вы всегда отправляете 20480 байт, даже если достигнут конец файла. Это может привести к тому, что файл на принимающей стороне будет иметь мусор в конце.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]