Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Вниз

Хаос при передаче по UDP (indy 10)   Найти похожие ветки 

 
DeadMeat ©   (2006-01-02 15:49) [0]

Здравствуйте.
Я тут пишу некое, жалкое подобие передачи видео по сети. Пока начал с простого - передача картинок как есть (bmp).
Для передачи использую indy10.0.76_d6 (вроде как).

Код передачи:
i:=1;
while mem.Position<mem.size do
begin
if ((mem.size-mem.position)>(idudpclient1.buffersize-2)) then setlength (buf,idudpclient1.buffersize-2) else setlength (buf,mem.size-mem.position);
mem.Read(buf[0],length (buf));
setlength (buf,length (buf)+2);
movememory (@buf[2],@buf[0],length (buf)-2);
if (mem.size mod (idudpclient1.buffersize-2))=0 then num:=mem.size div (idudpclient1.buffersize-2) else num:=trunc (mem.size/(idudpclient1.buffersize-2))+1;
buf[0]:=i;
buf[1]:=num;
idudpclient1.SendBuffer(buf);
inc (i);
end;


Здесь:
mem:tmemorystream;
num,i:byte;
buf:tbytes;


"Протокол" очень прост. Первый байт - номер "куска" кадра. Второй - количество "кусков" в одном кадре.

Принимаю следующим образом:
mem.Write(adata[2],length (adata)-2);

if adata[0]=adata[1] then
begin
mem.Position:=0;
currentframe.LoadFromStream(mem);
mem.clear;
bitblt (canvas.handle,0,0,currentframe.Width,currentframe.Height,currentframe.Canvas.Handle,0,0,srccopy);


Здесь:
mem:tmemorystream;
currentframe:tbitmap;


Обработчик:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
 ABinding: TIdSocketHandle);


Так в чем собсна вопрос: если во время принятия кадров, показывать номер текущего "куска" кадра, то видно, что они идут в "разнобой". Т.е. к примеру у нас кадр разбивается на 10 кусков. Тогда при таком подходе, мы получаем примерно следующую последовательность:
1
2
5
9
или
1
8
9

Но может случиться так, что и нормальная последовательность проскочит.
Если во время передачи выставить паузу (sleep (50)), то все приходит в таком виде, в каком и надо.
Почему так? Я думал UDP не склеивает пакеты, как TCP.
Или может в другом дело?
Просвятите пожалуйста...

ЗЫ. Знаю, код выглядит ужасно...


 
Eraser ©   (2006-01-02 15:54) [1]


> DeadMeat ©   (02.01.06 15:49)

UDP не гарантирует доставку дейтаграммы и последовательность дейтограмм.
Советую применить буфферизацию, у уже из буффера в нужном порядке показывать "видео".


 
XProger ©   (2006-01-02 21:43) [2]

DeadMeat, именно благодаря этому UDP передача данных быстре TCP :)


 
FrykT ©   (2006-01-03 06:20) [3]

Сделать на TCP :)


 
DeadMeat ©   (2006-01-03 14:14) [4]

Хмм.. Ну я полагал, что в пределах локального компьютера не будет таких потерь. Я ведь еще даже в сеть не выводил. Только у себя тестил.

Да и почему при установки паузы все становится на свои места?

---
...Death Is Only The Begining...


 
Eraser ©   (2006-01-03 14:43) [5]


> DeadMeat ©   (03.01.06 14:14) [4]


> Да и почему при установки паузы все становится на свои места?

Как почему? Пакеты не успевают "перемешиваться".

> Хмм.. Ну я полагал, что в пределах локального компьютера
> не будет таких потерь. Я ведь еще даже в сеть не выводил.
>  Только у себя тестил.

Возможно в реальной LAN всё будет работать лучше, по крайней мере пакеты перемешиваться не так будут... хотя ХЗ.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.056 c
3-1140582394
abcd_ff
2006-02-22 07:26
2006.04.16
Вставка букв узбекского языка в проекте и сохранение в базе


2-1143788951
Ega23
2006-03-31 11:09
2006.04.16
Поиск параметров командной строки


2-1143094636
Parus
2006-03-23 09:17
2006.04.16
Строка


15-1143125776
ZeFiR
2006-03-23 17:56
2006.04.16
Преобразование картинки в ASCII символы


2-1143632624
apic
2006-03-29 15:43
2006.04.16
Уважаемые мастера, ПАМАГИТЕ!!!!!!!!!!!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский