Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Хаос при передаче по 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
2-1144038764
Рома
2006-04-03 08:32
2006.04.16
TreeView


5-1129264772
MikeGipson
2005-10-14 08:39
2006.04.16
Не могу показать компонент


2-1144053643
VAZMan
2006-04-03 12:40
2006.04.16
RadioButton


15-1142807778
Bogdan1024
2006-03-20 01:36
2006.04.16
Агрессивные вегетарианцы


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