Форум: "Сети";
Текущий архив: 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
91
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