Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TIdUDPserver


Страницы:   1 2

DesWind ©   (2006-08-17 14:30:00) 

Есть UDP-клиент, который отправляет данные таким образом

procedure SomeEvent(Sender: TObject);
var
str: string

begin

....
udpClient.Send(str);

end;

Настроен на конкретный IP.

Есть UDP сервер, настроенный(может не правильно) принимать пакеты с любого IP.


procedure TSomeThread.Execute;
var
Str: string;

begin
 Str:=dtmRecive.udpRecive.ReceiveString();
 CritSec.Acquire;
  try
   DataStrs:=DataStrs+Str;
  finally
   CritSec.Release;
  end;
end;


Так вот строки приходят через одну, т.е если посылать то "А" то "В" - приходят только "В". Что я делаю не так?


Slym   (2006-08-17 15:39:00) [21]

Slym ©   (17.08.06 15:36) [13]
а теперь так:
program Project2;

{$APPTYPE CONSOLE}

uses
 SysUtils,Classes,SyncObjs;

type
 TTestThread=class(TThread)
 protected
   procedure Execute; override;
 end;

var s:string;
var cs:TCriticalSection;
var t:TTestThread;

procedure TTestThread.Execute;
var i:integer;
begin
 FreeOnTerminate:=true;
 repeat
   cs.Enter;
   try
     i:=StrToInt(s);
     sleep(0);
     if i<>StrToInt(s) then raise exception.Create('Alarm');
     s:=IntToStr(i+1);
     writeln(s);
   finally
     cs.Leave;
   end;
 until not(i<maxint);
end;

begin
 s:='0';
 cs:=TCriticalSection.Create;
 try
   TTestThread.Create(false);
   t:=TTestThread.Create(false);
   t.WaitFor;
 finally
   cs.Free;
 end;
end.


DesWind   (2006-08-17 15:37:00) [22]


> ошибка гдето в остальном коде...

Остального кода нет :), разве что по таймеру в мемо выводится DataStrs. Если перевести TidUDPServer на события (т.е. выбирать данные по событию IdUDPServer1UDPRead), то все приходит нормально как и должно, но меня события не устраивают.


Slym   (2006-08-17 15:36:00) [23]

Ketmar ©   (17.08.06 15:24) [10]
что это не совсем правда

попробуй:
program Project2;

{$APPTYPE CONSOLE}

uses
 SysUtils,Classes;

type
 TTestThread=class(TThread)
 protected
   procedure Execute; override;
 end;

var s:string;
var t:TTestThread;

procedure TTestThread.Execute;
var i:integer;
begin
 FreeOnTerminate:=true;
 repeat
   i:=StrToInt(s);
   sleep(0);
   if i<>StrToInt(s) then raise exception.Create('Alarm');
   s:=IntToStr(i+1);
   writeln(s);
 until not(i<maxint);
end;

begin
 s:='0';
 TTestThread.Create(false);
 t:=TTestThread.Create(false);
 t.WaitFor;
end.


Ketmar   (2006-08-17 15:27:00) [24]

> [11] Slym ©   (17.08.06 15:26)
я имел в виду "такого, как для TCP, где накапливаются пакеты". накопления не происходит, новоприбывший пакет замещает старый.


Slym   (2006-08-17 15:26:00) [25]

Ketmar ©   (17.08.06 14:54) [3]
для udp нет буфера

откуда это? по дефолту буфер есть у всех... в т.ч. и у RAW соков только буфер то маленький... и все что в него не влазит - игнорится (UDP)


Ketmar   (2006-08-17 15:24:00) [26]

> [7] Slym ©   (17.08.06 15:22)
> строка это сложный поточно незащищенный ресурс
точно? я полез читать исходник. потому как мне память подсказывает, что это не совсем правда.


Slym   (2006-08-17 15:23:00) [27]

DesWind ©   (17.08.06 15:18) [6]
Если нарушен порядок символов так это от того что порядок пакетов UDP не гарантирует


Ketmar   (2006-08-17 15:23:00) [28]

так может пакеты вообще теряются нафиг в дороге. "была зима, на небе были тучи..." (ц)
по твоему коду нифига не ясно.


Slym   (2006-08-17 15:22:00) [29]

Ketmar ©   (17.08.06 14:37) [1]
а зачем критическая секция? для строк не надо

Надо... строка это сложный поточно незащищенный ресурс
DesWind ©   (17.08.06 15:01) [5]
Выбирать я их точно успеваю

ошибка гдето в остальном коде...


DesWind   (2006-08-17 15:18:00) [30]

А вообще получаются очень интересные строчики на выходе типа такого "ABBBBBBBABBBBBBABBBBBBABBBBBBABBBBBBABBBBBBABBBBBBABBBBBBA", или еще какойнить рисунок.... Ниче не понимаю!!!!


DesWind   (2006-08-17 15:01:00) [31]

Вообще-то оправляется по одному символу где-то раз в 10 сек. Выбирать я их точно успеваю.


Slym   (2006-08-17 14:57:00) [32]

DesWind ©   (17.08.06 14:30)
если посылать то "А" то "В" - приходят только "В".

Файрвол на букву "А" :)


Ketmar   (2006-08-17 14:54:00) [33]

а вообще -- для udp нет буфера. если ты не успел забрать пакет до прихода нового -- то уже и не заберёшь никогда. есть подозрение, что пакеты приходят шутсро, а забираются медленно. потому и теряются -- старый пакет перезаписывается новым до выборки.


DesWind   (2006-08-17 14:45:00) [34]

Ниче здоровее будет.


Ketmar   (2006-08-17 14:37:00) [35]

а зачем критическая секция? для строк не надо. %-)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо