Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
44 / 44 / 17
Регистрация: 13.09.2012
Сообщений: 196
1

Как переслать размер файла серверу

14.10.2012, 19:40. Показов 1135. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
собственно вопрос

правильно ли я понимаю, что функция recv в случае обычных сокетов не будет возвращать
управление до тех пор, пока буфер не заполнится числом байтов size?

recv(socket,char*,size,flags)

Размер файла я посчитал

C++
1
for(size_t file_size=0; fgetc(f) != EOF; file_size++);

Ну как мне его переслать серверу?
Неужели нужно переслать количество байт, которое выделено под размер файла

В моем случае размер файла 43345 байт
Т.е. 2 байта занимает переменная равная 43345

Я сначала пересылаю размер под переменную для размера файла

Добавлено через 1 час 15 минут
Вообщем это главный вопрос

правильно ли я понимаю, что функция recv в случае обычных сокетов не будет возвращать
управление до тех пор, пока буфер не заполнится числом байтов size?

recv(socket,char*,size,flags)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2012, 19:40
Ответы с готовыми решениями:

ListView, как отобразить имя файла и размер файла?
Подскажите, как в ListView отобразить имя файла и размер файла. используя DirectoryListBox1...

Вычислить суммарный размер файлов в килобайтах и средний размер файла
Нужно составить программу с помощью которой с клавиатуры вводятся размер 6 файлов в байтах(от 100...

Как определить размер файла?
Сабжж! Научите пожалста! Я вот нашёл функцию GetFileSize но никак не разберусь как она работает.

Как узнать размер файла?
Подскажите, пожалуйста, как узнать размер файла (независимо - Win98 или WinXP, Fat32 или NTFS)?

12
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
14.10.2012, 21:50 2
Цитата Сообщение от kotleta Посмотреть сообщение
for(size_t file_size=0; fgetc(f) != EOF; file_size++);
видел этот код в списке самых корявых способов определить размер файла

Цитата Сообщение от kotleta Посмотреть сообщение
правильно ли я понимаю, что функция recv в случае обычных сокетов не будет возвращать
управление до тех пор, пока буфер не заполнится числом байтов size?
правильно.

Цитата Сообщение от kotleta Посмотреть сообщение
Ну как мне его переслать серверу?
так:
C++
1
2
std::size_t file_size = ...
int rc = send(socket, ((const char*)&file_size), sizeof(file_size), 0);
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.10.2012, 08:56 3
Цитата Сообщение от kotleta Посмотреть сообщение
правильно ли я понимаю, что функция recv в случае обычных сокетов не будет возвращать
управление до тех пор, пока буфер не заполнится числом байтов size?
Нет. Процесс будет блокирован до тех пор, пока не придет хотя бы 1 октет, или клиент не закроет сокет, или не случиться ошибка/таймаут или сигнал (для систем где сигналы есть). size это верхняя граница: больше чем size recv() никогда не вернет, а вот меньше пожалуйста. За исключением пункта про 1 октет это справедлива и для recv(,,,MSG_WAITALL).

Добавлено через 1 минуту
зы: для размера файла лучше брать off_t, а не size_t
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
15.10.2012, 10:17 4
kotleta, написанное g_u_e_s_t касательно recv() к твоему случаю не относится. касательно же off_t - тоже вряд ли твой случай.

Добавлено через 1 минуту
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
октет
чем слово "байт" не угодило?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.10.2012, 10:27 5
niXman, ссылочкой на мануал от любой системой, где _гарантируют_, что recv() на блокируемом SOCK_STREAM не может вернуть меньше, чем просят, не поделитесь?
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
15.10.2012, 10:35 6
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
не поделитесь?
нет.
может быть Вы поделитесь ссылкочкой на доку любой системы, где recv() читает не байты а биты или тетрады?

по уровню вопросов ТС разве не понятно, что сказанное Вами его только запутает?

Добавлено через 2 минуты
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Процесс будет блокирован до тех пор, пока не придет хотя бы 1 октет
что-то не припомню, чтоб recv() возвращал управление по прочтению каждого байта %)
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.10.2012, 10:43 7
Цитата Сообщение от niXman Посмотреть сообщение
нет.
т.е. врете.
Цитата Сообщение от niXman Посмотреть сообщение
ожет быть Вы поделитесь ссылкочкой на доку любой системы, где recv() читает не байты а биты или тетрады?
Нет. конечно. Есть строгое определение для Беркли (они же сейчас posix) сокетов CHAR_BIT == 8. Если Вас так смущает слово октет, читайте байт. От этого написанное мной не измениться.
Цитата Сообщение от niXman Посмотреть сообщение
по уровню вопросов ТС разве не понятно, что сказанное Вами его только запутает?
Это не повод врать.

Добавлено через 3 минуты
Цитата Сообщение от niXman Посмотреть сообщение
что-то не припомню, чтоб recv() возвращал управление по прочтению каждого байта %)
Учитесь читать написанное - пришлют хотя бы 1 != каждый. Сколько есть в SO_RCVBUF столько и вернут.
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
15.10.2012, 11:28 8
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
т.е. врете.
Вам виднее.

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Есть строгое определение для Беркли (они же сейчас posix) сокетов CHAR_BIT == 8
ну и славно.
вот только для чего оно? разве существуют системы где это не так?

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Это не повод врать.
это повод засорят ТС`у моцг?
т.е. Вы, видя что ТС в зачаточной стадии, намеренно усложняете простое?

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Учитесь читать написанное
взаимно.
я уже писал о том, что написанное Вами ТС`у не поможет, а только навредит. поэтому, написанное Вами касательно сигналов я исключил отвечая на Ваш первый пост. если еще и учесть тот момент, что вероятно(мне кажется - очевидно), вопрос ТС`а относится к штатной работе без учета обрыва соединения, то написанное Вами вообще не отвечает ни на один вопрос ТС`а и, как следствие, является тематическим флудом.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.10.2012, 11:57 9
Цитата Сообщение от niXman Посмотреть сообщение
вот только для чего оно? разве существуют системы где это не так?
Да, существуют (правда во сновном это free-standing). Но как Вы ниже сказали это офтопик и флуд.
Цитата Сообщение от niXman Посмотреть сообщение
я уже писал о том, что написанное Вами ТС`у не поможет, а только навредит. поэтому, написанное Вами касательно сигналов я исключил отвечая на Ваш первый пост. если еще и учесть тот момент, что вероятно(мне кажется - очевидно), вопрос ТС`а относится к штатной работе без учета обрыва соединения, то написанное Вами вообще не отвечает ни на один вопрос ТС`а и, как следствие, является тематическим флудом.
Пардон, но эти Ваши препирательства и есть флуд по большей части.
Касательно фантазий о каких то обрывах - прочтите наконец man recv или хотя б соответсвующий раздел MSDN где сказано, что вернуть меньше - _абсолютно_ штатная ситуация. если тяжело читать - сделайте простой тест (код до accept() включительно думаю сможете сами):
C
1
2
3
4
5
6
7
8
9
char buf[100*1024]
while(1) {
        n = recv(peer, &buf, sizeof(buf), 0);
        if (n <= 0) {
                warn("recv");
                break;
        }
        printf("buf size=%lu, recivied %ld byte(s).\n", sizeof buf, n);
}
и с соседней машины telnet или nc, жмем <enter>, смотрим:
buf size=102400, recivied 1 byte(s).
buf size=102400, recivied 1 byte(s).
buf size=102400, recivied 1 byte(s).
...
ps: у меня создается впечатление, что Вы путаете recv() и send() для которого как раз и обещают отправить столько, сколько просят.
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
15.10.2012, 12:09 10
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Вы путаете recv() и send()
ппц %)
да, я про send(). все перепутал. замолкаю.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.10.2012, 12:13 11
Может, тогда как модератор потрете весь офтоп? чтоб реально не пугать/путать ТС.
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
15.10.2012, 12:28 12
из модераторов исключили за неповиновение =)
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.10.2012, 12:45 13
Бывает. Давайте тогда покажем ТС'у такой самокат:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
size_t atomic_recv(int s, void *buf, size_t n)
{
        size_t pos = 0;
        ssize_t res;
 
        while (n > pos) {
                res = recv(s, buf + pos, n - pos, 0);
                if (res <= 0)
                        return 0;
                pos += (size_t)res;
        }
        return (pos);
}
0
15.10.2012, 12:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2012, 12:45
Помогаю со студенческими работами здесь

Как узнать размер файла?
Здравствуйте,нашел такой код только он чёт не правельно работает, подскажите пожалуйста If...

Как посчитать размер файла?
При выводе у меня показывает не тот размер который должен быть. int y; y =...

Как получить размер файла ?
Всем привет, пишу программу и мне нужно чтобы в text1.text вписывались значения размера файла, и...

Как запросить размер файла?
Вот например лежит на сайте файл Н-р: http://www.naprimer_sait.ru/a_eto_tipo_fayl.docx Как можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru