Главная страница
    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-1143358757
Wolfram
2006-03-26 11:39
2006.04.16
Как получить номер строки в коде?


2-1143626207
FAA
2006-03-29 13:56
2006.04.16
Компонент DateTimePicker


2-1143650573
13
2006-03-29 20:42
2006.04.16
удаление из ListView


15-1143462967
stone
2006-03-27 16:36
2006.04.16
Работа и жизнь...


15-1143298597
Sergey Masloff
2006-03-25 17:56
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский