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); // і от тут ми знову забираємо дані з черги, але тепер видаляємо їх з черги
тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P

2

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

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

3

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

koala написав:

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

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

тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P

4

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

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

5

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

koala написав:

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

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

тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P

6

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

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

7

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

Replace написав:

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

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

тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P

8

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

ні

схемка
http://www.snmptools.net/netbasics/layers/p02.jpg
Подякували: FakiNyan1

9

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

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

тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P

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

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

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

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

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

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

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