Главная страница
    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.036 c
2-1143814789
Der Nechk@ssoff
2006-03-31 18:19
2006.04.16
Clean Image


2-1143460817
Igorntk
2006-03-27 16:00
2006.04.16
Максимальное значение поля


2-1144134211
вопросник
2006-04-04 11:03
2006.04.16
DrawText


15-1143032556
MBo
2006-03-22 16:02
2006.04.16
Эксперт для использования в BDS хелпа от D7 или D6


2-1143885703
Dyakon_Frost
2006-04-01 14:01
2006.04.16
Проблемы с StringGrid





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