Главная страница
    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.038 c
15-1143130425
Джо
2006-03-23 19:13
2006.04.16
Exit и компания


1-1142333840
DelphiLexx
2006-03-14 13:57
2006.04.16
Растягивание TListBox


15-1142855044
carmen
2006-03-20 14:44
2006.04.16
пример плагинов bpl з базой данных


2-1143922266
He3Hauka
2006-04-02 00:11
2006.04.16
Топологическая сортировка TreeView


4-1138703983
Kolan
2006-01-31 13:39
2006.04.16
Вызов API диалога настройки Com порта.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский