Передача файлов...
Заранее спасибо..
ну сломай касперского да посмотри как у него реализовано
Это прикол такой в последнее время–заставлять новичков то из потока побайтно читать,то данные побайтно пересылать?:)
Чтобы узнать скорость приёма,надо объём принятых данных разделить на время,за которое они были приняты.На это есть 2 способа:
• создать таймер с периодом 1 с,при приёме данных суммировать их объём.Когда сработает таймер,вывести полученную сумму–это будет количество байт в секунду.Не забывать потом обнулять сумму
• суммирование количества принятых байт.При достижении определённого объёма произвести расчёт времени,за которое оный был принят(естественно,надо задаться временем начала отсчёта и вычесть его из текущего),а потом разделить количество байт на время
Чтобы узнать скорость приёма,надо объём принятых данных разделить на время,за которое они были приняты.На это есть 2 способа:
• создать таймер с периодом 1 с,при приёме данных суммировать их объём.Когда сработает таймер,вывести полученную сумму–это будет количество байт в секунду.Не забывать потом обнулять сумму
• суммирование количества принятых байт.При достижении определённого объёма произвести расчёт времени,за которое оный был принят(естественно,надо задаться временем начала отсчёта и вычесть его из текущего),а потом разделить количество байт на время
я как то по другому сказал? вроде то же самое...
Но есть еще выход из моей ситуации...
В диспетчере задач есть вкладка сеть. На ней отображается загрузка
сетевого адаптера.
Можно ли программно получить эти цифры загрузки какого либо адаптера, или нет?
____________________________________________
Извените, но все с чего-нибудь начинают...
{
DWORD start = ::GetTickCount();
// копируем блок (1 Кб к примеру)
DWORD stop = ::GetTickCount() - start;
// 1Кб скопировалось за stop мс.
}
Но есть еще выход из моей ситуации...
В диспетчере задач есть вкладка сеть. На ней отображается загрузка
сетевого адаптера.
Можно ли программно получить эти цифры загрузки какого либо адаптера, или нет?
Может,это и возможно(наверняка),но:
• это будет наверняка сложней,чем тебе предложено
• а если параллельно с твоим приложением будет работать другое,которое что-то качает?Тогда результат будет неверным
Вон оксотник даже пример небольшой привёл,а не теорию,как я.Реализуй наздоровье!
Будут конкретные вопросы–задавай
while(100)
{
DWORD start = ::GetTickCount();
//копируем блок (1кб к примеру)
DWORD stop = ::GetTickCount() - start;
// 1кб скопировалось за stop мс.
Label1->Caption=stop;
Но вот этот код неработает.
Может я ошибся но как я понял
в start должен содержаться какой то файл а как связать копирование и приведенный вами пример ненаю...
помогите пожалуйсто разобраться...:(
Нет, не так. Надо открыть сначала файл
Потом в цикле побайтно его читать
Хотя где здесь вообще передача файлов? Это просто его копирование.
прогамма запускается нормально но вот в чем проблемма стоит мне открыть сетевой ресурс который связан с копированием как тут же начинают вылазить бесконечно окна а в окнах написано следующее:
че он пишет я незнаю но явно что то связанное с переменной float
вот код:
CopyFile("C:\\12.txt","\\\\192.168.4.111\\12.txt",false);
CopyFile("\\\\192.168.4.111\\12.txt","c:\\12.txt",false);
float stop =StrToFloat( GetTickCount()-start);//время за которое файл
был скачен
FormatFloat("0.00",stop);
float size = 4;//Размер файла
float Speed ;
Speed = (size/stop)*1000;
Label3->Caption=FormatFloat("0.00", Speed);
Label2->Caption=Label3->Caption+" Кб./Сек.";
Я,конечно,не знаток C++,но понимаю,что целые значения пытаться преобразовать функцией StrToFloat,по крайней мере,невежливо по отношению к компилятору.Да и зачем,собственно,вы преобразуете время в миллисекундах,которое может быть только целым(большую точность таймер не позволяет),во float?
Может,дело в моём незнании C++,но можно и без этого обойтись вроде.Вот для результата деления да,насколько я помню,нужна нецелая переменная
И почему
А так формула
Upd:ах да,насчёт деления на 0…Время копирования файла может быть так мало,что разница,которая хранится в stop,может оказаться равна 0.Посему проверяйте ваш результат
P.S.Только заметил:зачем файл копировать по сети,а затем возвращать обратно?:)
Почему, у меня в коде все время один и тот же размер файла?
Потому что он и есть один файл который служит для своего рода
пинга, отправка прием и все это за определнное время которое указано в
stop.
Почему Копируется туда потом обратно?
Как я обьяснил это своего рода пинг.
А вообще с делением на 0 я свами согласен, именно поэтому я и преобразовал в float за счет точных данных,(ну там 0,33, к примеру)
0 небудет.
На 1000 я умножая для перевода из милисекунд в сеунды.
ведь мне нужно получить Кб.\Сек. а не Кб.\мл.
Вроде все как надо но Ошибка появляющияся при моем обращение к сетевому ресурсу просто убивает.
Сейчас попробую переписать код(вернее,строчки перетасовать:)),как мне он видится[Highlight=CPP]int start=GetTickCount();
CopyFile("C:\\12.txt","\\\\192.168.4.111\\12.txt",false);
CopyFile("\\\\192.168.4.111\\12.txt","c:\\12.txt",false);
int stop=GetTickCount()-start;//время за которое файл был скачАн
float size=4;//Размер файла(он что,4 байта?)
float Speed;
Speed=size/((float)stop*1000);
Label3->Caption=FormatFloat("0.00", Speed);
Label2->Caption=Label3->Caption+" Кб/с";[/Highlight]На 1000 не там умножали:)
А после единиц измерения точки не ставят.Ещё в школе учили
Upd:вот что,за код не пинайте,пожалуйста.А знающие это дело могут подправить код,за что им от топикстартера будет большая благодарность (=
И просьба такая–указать на мои ошибки.Ну чтоб я в следующий раз таких не допускал
Ошибка как вылетала так и вылетает. Но почемуто перестало высчитываться скорость а именно size/((float)stop*1000);
всегда равно 0.
Пусть тогда кто-нибудь более смыслящий поправит
И ещё кое-что:а вы отладкой пользовались?Если нет,то воспользуйтесь и сообщите,на какой строчке возникает сия ошибка
в коде указан сетевой путь: "\\\\192.168.4.111\\updates\\12.txt"
Если во время работы программы зайти в указанную выше сетевую папку посредство Windows из командной строки. Тут же начинает бесконечно вылезать окно: в котором после того как я заменил все float на Int вылазиет сообщение: "Division by zero". Че это такое я незнаю но она очень сильно мешает. программа фактически перестает работать причем немогу понять как это все связано.
Да я немного переделал формулу мне кажется так будет точнее:
1.stop - время за которое проходит отправка\прием файла размером 4кб. получили ответ в мл.
2.1000 - В 1 секунде 1000 мл.
3.4кб. - размер файла
Формула:
(1сек\stop)*4
На мой взгляд таким образом мы получим более точный результат.
Делением одной секунды (1000мл.) на stop(например: 55мл.)
мы узнаем что в 1 сек. с таким интервалом копирования можно скопировать 18 раз. А для получения в Кб. Мы умножаем 18 на размер
файла и получаем ответ 72Кб\сек. То есть за одну секунду мы можем 18 раз скопировать этот файл в данный момент а после умножения мы получаем уже точный ответ.
Самое главное избавиться от этого бесконечного сообщения.
Самое главное избавиться от этого бесконечного сообщения.
Из тех обрывков кода, что вы приводите, невозможно понять, где у вас ошибка (великая тайна, да!). Надеюсь, вы понимаете, что Division by zero означает Деление на ноль? Вот и ищите, где у вас происходит деление на ноль. Осмелюсь предположить (выложите больше кода, можно будет сказать точнее), что у вас теряется значение в ходе преобразования из целого в вещественное.
Кусочек кода для размышлений:
printf("%f\n", 1/1000.0);
К тому же у вас нет проверки успешности выполнения функции CopyFile. Она вообще работает? Соединение есть?
И возвращаясь к сабжу темы. Почему бы не использовать, скажем, функцию CopyFileEx для определения скорости копирования файлов?
И возвращаясь к сабжу темы. Почему бы не использовать, скажем, функцию CopyFileEx для определения скорости копирования файлов?
Чет я несовесем уверен в возможности определения скорости функции
CopyFileEx.
Приведите пример, если это возможно...
Но релизовать его повидимому сложновато мне самому.
В поиске ничего нет есть только такие же предложения о использовании функции CopyFileEx, впрочем как и на google
Помогите пожалйсто разобраться с этой функцией (ведь ее еще подробно не решали на форуме).
Впринцепе почти все понятно но как это реализовать немного недоганяю.
BOOL CopyFileEx(
LPCWSTR lpExistingFileName,
LPCWSTR lpNewFileName,
LPPROGRESS_ROUTINE lpProgressRoutine,
LPVOID lpData,
LPBOOL pbCancel,
DWORD dwCopyFlags
);
первые две опции я думаю всем понятны это как и в CopyFile, путь_имя_файла, путь_имя_файла.
IpData и pbCancel, незнаю какие команды можно применить.
dwCopyFlags, и какие флаги тож ненаю.
Вот задача посложней с IpProgressRoutine. Как я понял ее нужно организовать отдельно, а как через переменную.
Да и как я понял IpProgressRoute работает как отдельная функция
CopyProgressRoutine.
тогда и там возникают вопросы
DWORD WINAPI CopyProgressRoutine(
LARGE_INTEGER TotalFileSize,
LARGE_INTEGER TotalBytesTransferred,
LARGE_INTEGER StreamSize,
LARGE_INTEGER StreamBytesTransferred,
DWORD dwStreamNumber,
DWORD dwCallbackReason,
HANDLE hSourceFile,
HANDLE hDestinationFile,
LPVOID lpData
);
Тут тоже вопросы. Как всеэто организовать и соединить CopyFileEx с CopyProgressRoutinе.
Уважаемые мудрые головы кому не составит особого труда и особой сложности помогите разобраться со всей этой байдой.
Наверняка токой вопрос не у меня одного, но тем не менее его досканально на форуме не обсуждали и не решали.
_______________________________________
Извените если глупость написал.
можно ограничить скорость копирования или нет? Если да то каким способом, немогу сам допетрить. В поиске то же ничего ненашел об этом.