Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.124.40] |
|
Сообщ.
#1
,
|
|
|
Вашему вниманию предлагается алгоритм передачи файла по UDP IPv4 IPv6 (применимо и для всех остальных протоколов) без подтверждения и обратного управления на примере графического файла.
А) В потоке передачи: 1. В бесконечном цикле. а) Делаем снимок экрана/нужного окна в CImage. б) Записываем в IStream данные из CImage (CImage::Save). в) Порциями например по 50000 байт передаём данные из IStream: 1) в цикле по количеству порций: 1-а) формируем заголовок с командой "/video". 2-б) считываем текущую порцию из IStream по смещению current_data_offset расчётное количество байт (размер порции передачи минус размер заголовка) (IStream::Read). 3-в) отправляем порцию по сети. 2) формируем заголовок с командой "/video_end" и передаём по сети. Б) В потоке приёма: 1. В бесконечном цикле становимся на получение с периодом ожидания 1 секунда. а) При получении данных формируем в куче параметры для процедуры (синхронный приём)/ потока (асинхронный приём). б) Вызываем функцию/запускаем поток. в) В функции/потоке обрабатываем заголовок полученных данных: 1) получена команда "/video" - блокируем работу с IStream (CSingleLock, CCriticalSection), записываем данные в IStream (IStream::Write). 2) получена команда "/video_end" - блокируем работу с IStream (CSingleLock, CCriticalSection),записываем накопившиеся данные из IStream (IStream::Read) в CImage (CImage::Load), предварительно установив указатель IStream на начало потока IStream::Seek). Возможные улучшения: 1. В заголовке можно указывать номер порции и смещение в исходном IStream. 2. Можно добавить обратное управление с запросом нужной порции например по TCP (каналу управления) или по UDP (обратное управление без подтверждения). |