1

Тема: UDP. Як прийняти файл, довжину котрого ми не знаємо?

Хай. Для того, аби прийняти якісь дані, ми маємо виділити пам'ять під них. Але якщо ми не знаємо довжини файлу, то як нам бути?
Я пробував ось так, але це не працює, бо вилазе помилка під час виконання

char recvBuff1[1]; // ініціалізуємо масивчик, аби був
        Client client; // ну це мій клас, в ньому просто структура з даними про адресу і довжина тої структури
        int n = recvfrom(sock, recvBuff1, 1, MSG_PEEK, (sockaddr*)&client.addr, (int*)&client.addrLength); // MSG_PEEK заносить дані в recvBuff1, але не видаляє ці дані з черги
        char * recvBuff = new char[n]; // n - довжина прийнятих даних
        recvfrom(sock, recvBuff, n, 0, (sockaddr*)&client.addr, (int*)&client.addrLength); // і от тут ми знову забираємо дані з черги, але тепер видаляємо їх з черги

2

Re: UDP. Як прийняти файл, довжину котрого ми не знаємо?

Для цього і придумали буфер: читаєте шматок, якщо ще не все - читаєте наступний і т.д.

3

Re: UDP. Як прийняти файл, довжину котрого ми не знаємо?

koala написав:

Для цього і придумали буфер: читаєте шматок, якщо ще не все - читаєте наступний і т.д.

еее, це як? Якщо в мене буфер в 4 байти, і приходить інфа в 5 байтів або більше, то recv повертає -1 і нічого не приймає

4

Re: UDP. Як прийняти файл, довжину котрого ми не знаємо?

А, ви за UDP? Максимальний розмір датаграми - 65535, і це з технічними заголовками.

5

Re: UDP. Як прийняти файл, довжину котрого ми не знаємо?

koala написав:

А, ви за UDP? Максимальний розмір датаграми - 65535, і це з технічними заголовками.

то мона відразу створювати масив в 65535 байт, і після прийняття даних звільняти його, а потім знову і знову? І як тоді передавати великі файли? Розбивати їх на частинки?

6

Re: UDP. Як прийняти файл, довжину котрого ми не знаємо?

Для цього інший протокол треба використовувати (tcp).

7

Re: UDP. Як прийняти файл, довжину котрого ми не знаємо?

Replace написав:

Для цього інший протокол треба використовувати (tcp).

так tcp побудований на udp, нє?

8

Re: UDP. Як прийняти файл, довжину котрого ми не знаємо?

ні

схемка

http://www.snmptools.net/netbasics/layers/p02.jpg

Подякували: FakiNyan1

9

Re: UDP. Як прийняти файл, довжину котрого ми не знаємо?

капець, все життя думав, що tcp це крутий udp

10 Востаннє редагувалося koala (07.10.2014 08:21:59)

Re: UDP. Як прийняти файл, довжину котрого ми не знаємо?

FakiNyan написав:
koala написав:

А, ви за UDP? Максимальний розмір датаграми - 65535, і це з технічними заголовками.

то мона відразу створювати масив в 65535 байт, і після прийняття даних звільняти його, а потім знову і знову? І як тоді передавати великі файли? Розбивати їх на частинки?

Нащо звільняти? Почали прийом - виділили, закінчили - звільнили. А між тим використовуєте багато разів в циклі.
І так, по UDP треба розбивати. Зверніть увагу, що recvfrom позначає довжину як int - тобто більш ніж 2147483647 байт ви так прийняти не зможете. А файли більшого розміру якось же передаються.

Подякували: FakiNyan1